Вы делаете основную, но распространенную ошибку, путая представление строки в исходном коде Python с ее фактическим значением.
В Python есть ряд escape-кодов, которые не представлены дословно в обычных строках исходного кода. Например, "\n"
представляет один символ новой строки, хотя нотация Python занимает два символа. Обратная косая черта используется для введения этой записи. Существует несколько выделенных escape-кодов, таких как \r
, \a
и т. Д., И обобщенная нотация \x01
, которая позволяет записывать любой код символа в шестнадцатеричной нотации (\n
эквивалентно \x0a
, \r
эквивалентно \x0d
и т. д.). Чтобы представить буквальный символ обратной косой черты, вам нужно экранировать его с другой обратной косой чертой: "\\"
.
В «сырой строке» экранирование без обратной косой черты не поддерживается; поэтому r"\n"
представляет строку, содержащую два символа: буквальный обратный слеш \
и буквальный строчный n
. Вы могли бы эквивалентно написать "\\n"
, используя не необработанную строковую нотацию. Префикс r
не является частью строки, он просто говорит Python, как интерпретировать строку между следующими кавычками (т. Е. Вообще без интерпретации; каждый символ представляет себя дословно).
Из вашего вопроса не ясно, какая из этих интерпретаций вам действительно нужна, поэтому я представлю решения для обоих.
Вот литеральная строка, содержащая фактические обратные слеши:
pat = re.compile(r'\\[xX][0-9a-fA-F]+')
s = r"we are \xaf\x06OK\x03family, good"
print(s)
print(re.sub(pat, '', s))
Вот строка, содержащая управляющие символы и не-ASCII-символы, и подстановка регулярных выражений для их удаления:
pat = re.compile(r'[\x00-\x1f\x80-\xff]+')
s = "we are \xaf\x06OK\x03family, good"
print(s)
print(re.sub(pat, '', s))
Дополнительным осложнением является то, что движок регулярных выражений имеет свои собственные внутренние применения для обратной косой черты; мы обычно предпочитаем использовать необработанные строки для регулярных выражений, чтобы Python и механизм регулярных выражений не интерпретировали обратную косую черту (иногда несовместимыми способами).