Как найти в строке коды символов вроде \x07 используя re Python

Имеется строка с закодированными управляющими символами ascii вроде "Информационное письмо \x07 Текст \x07 Ещё текст." Надо из неё выловить \x07 и заменить на ' '. Следующий паттерн не отлавливает, хотя в онлайн проверяльщике показывает, что должен.

pattern = [\\]x[0-9a-fA-F]{2}

Использую Пайчарм и Пайтон 3.8. Подскажите, плиз, как отлавливать такие штуки.


Ответы (3 шт):

Автор решения: CrazyElf

Судя по комментарию автора, нужно просто фильтровать все 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)))

Вывод:

Информационное письмо  Текст  Ещё текст.   И прочее  и прочее
→ Ссылка
Автор решения: Maeglin

Решение проблемы с помощью регулярок заключается в функции repr().

old = repr("Информационное письмо \x07 Текст \x07 Ещё текст.")
pattern = r'\\x[0-9a-fA-F]{2}'
new = re.sub(pattern, '', old)
print(old)
print(new)

Вывод:

'Информационное письмо \x07 Текст \x07 Ещё текст.'
'Информационное письмо  Текст  Ещё текст.'
→ Ссылка
Автор решения: insolor

Если нужно найти символы с кодами меньше 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.

→ Ссылка