Как найти в строке коды символов вроде \x07 используя re Python
Имеется строка с закодированными управляющими символами ascii вроде "Информационное письмо \x07 Текст \x07 Ещё текст." Надо из неё выловить \x07 и заменить на ' '. Следующий паттерн не отлавливает, хотя в онлайн проверяльщике показывает, что должен.
pattern = [\\]x[0-9a-fA-F]{2}
Использую Пайчарм и Пайтон 3.8. Подскажите, плиз, как отлавливать такие штуки.
Ответы (3 шт):
Судя по комментарию автора, нужно просто фильтровать все ASCII символы, код которых меньше, чем код "пробела" (32). Можно это сделать так:
s = "Информационное письмо \x07 Текст \x07 Ещё текст. \x02 \x1f И прочее \x0d и прочее"
print(''.join(ch for ch in s if ord(ch) >= 32))
Или через filter тоже самое:
print(''.join(filter(lambda x: ord(x) >= 32, s)))
Вывод:
Информационное письмо Текст Ещё текст. И прочее и прочее
Решение проблемы с помощью регулярок заключается в функции repr().
old = repr("Информационное письмо \x07 Текст \x07 Ещё текст.")
pattern = r'\\x[0-9a-fA-F]{2}'
new = re.sub(pattern, '', old)
print(old)
print(new)
Вывод:
'Информационное письмо \x07 Текст \x07 Ещё текст.'
'Информационное письмо Текст Ещё текст.'
Если нужно найти символы с кодами меньше 0x20, можно просто указать в регулярном выражении эти символы в виде кодов вида \xNN как диапазон:
import re
text = "Информационное письмо \x02 Текст \x07 Ещё текст."
pattern = r"[\x00-\x19]"
print(re.findall(pattern, text))
print(re.sub(pattern, '', text))
Вывод:
['\x02', '\x07']
Информационное письмо Текст Ещё текст.
Но правда будет реагировать и на '\n', например (код 0x0a), и другие управляющие символы, типа таба '\t', возврата каретки '\r' и т.д. - у них у всех код меньше 0x20.