регулярное выражение не может соответствовать специальным символам в питоне - PullRequest
0 голосов
/ 02 января 2019

У меня есть строка: s = "we are \xaf\x06OK\x03family, good", и я хочу заменить \xaf, \x06 и \x03 на '', регулярное выражение равно pat = re.compile(r'\\[xX][0-9a-fA-F]+'), но оно не может ничего соответствовать.Код приведен ниже:

pat = re.compile(r'\\[xX][0-9a-fA-F]+')
s = "we are \xaf\x06OK\x03family, good"
print(s)
print(re.sub(pat, '', s))

Результат:

we are ¯OKfamily, good we are ¯OKfamily, good,

Но как я могу получить we are OK family, good

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Другой подход:

pat = re.compile(r'[^\w\d\s,]+')
s = "we are \xaf\x06OK\x03family, good"
print(' '.join(map(lambda x: x.strip(), pat.split(s))))
#=> we are OK family, good

Используется обратное совпадение, удаляются (разбиваются) любые символы, которые не соответствуют вашим ожиданиям.

0 голосов
/ 02 января 2019

Вы делаете основную, но распространенную ошибку, путая представление строки в исходном коде 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 и механизм регулярных выражений не интерпретировали обратную косую черту (иногда несовместимыми способами).

0 голосов
/ 02 января 2019

Вы должны считать свой ввод string s необработанной строкой, тогда эта работа, см. Пример ниже:

pat = re.compile(r'\\[xX][0-9a-fA-F].')
s = r"we are \xaf\x06OK\x03family, good"
print(s)
print(re.sub(pat, '', s))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...