Экранировать специальные символы регулярного выражения в строке Python

126

Есть ли в Python функция, которую я могу использовать для экранирования специальных символов в регулярном выражении?

Например, I'm "stuck" :\должно стать I\'m \"stuck\" :\\.

Волчок
источник
2
Что вы считаете особенным персонажем?
pafcu
1
Полностью зависит от вашего контекста. Обычно эти символы совершенно нормальны, когда они находятся внутри строки.
poke
возможный дубликат escape-строки регулярного выражения в Python
Юкка Суомела

Ответы:

197

использование re.escape

>>> import re
>>> re.escape(r'\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> print(re.escape(r'\ a.*$'))
\\\ a\.\*\$
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com

Повторяя это здесь:

re.escape (строка)

Возвращает строку, содержащую обратную косую черту, отличную от буквенно-цифровых; это полезно, если вы хотите сопоставить произвольную буквальную строку, которая может содержать метасимволы регулярного выражения.

Начиная с Python 3.7 re.escape()был изменен, чтобы экранировать только символы, которые имеют значение для операций с регулярными выражениями.

pyfunc
источник
1
Вы можете использовать модуль regex вместо re. Примером может быть regex.escape(pattern,string,special_only=True
Lokinou
17

Я удивлен, что никто не упомянул использование регулярных выражений через re.sub():

import re
print re.sub(r'([\"])',    r'\\\1', 'it\'s "this"')  # it's \"this\"
print re.sub(r"([\'])",    r'\\\1', 'it\'s "this"')  # it\'s "this"
print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"')  # it\'s\ \"this\"

Важно отметить:

  • В шаблон поиска укажите, \а также символы, которые вы ищете. Вы собираетесь использовать, \чтобы убежать от своих персонажей, поэтому вам также нужно избегать этого .
  • Заключите шаблон поиска в круглые скобки , например ([\"]), чтобы шаблон подстановки мог использовать найденный символ, когда он добавляется \перед ним. (Вот что \1делает: использует значение первой группы в скобках.)
  • Знак rперед r'([\"])'означает, что это необработанная строка . Необработанные строки используют разные правила для экранирования обратной косой черты. Чтобы писать ([\"])как обычную строку, вам нужно удвоить все обратные косые черты и написать '([\\"])'. Необработанные строки более удобны при написании регулярных выражений.
  • В шаблоне подстановки вам нужно экранировать, \чтобы отличить его от обратной косой черты, которая предшествует группе подстановки, например \1, следовательно r'\\\1'. Чтобы написать это как простую строку, вам понадобится '\\\\\\1'- а это никому не нужно .
Тим Раддик
источник
9

Используйте repr () [1: -1]. В этом случае двойные кавычки не нужно экранировать. Срез [-1: 1] предназначен для удаления одинарной кавычки в начале и в конце.

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\

Или, может быть, вы просто хотите избежать фразы, чтобы вставить ее в свою программу? Если да, сделайте это:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
dp_
источник
3
Это не сработает, если строка является Unicode, потому что у вас будет u, и вам нужно будет запуститьrepr(x)[2:-1]
Антуан Пелисс
В python3.4, где все строки являются Unicode, к сожалению, это вообще не работает. Вместо этого print(repr("I'm stuck")[1:-1])печатает I'm stuck.
dantiston 04
3

Как уже было сказано выше, ответ зависит от вашего случая. Если вы хотите экранировать строку для регулярного выражения, вам следует использовать re.escape (). Но если вы хотите избежать определенного набора символов, используйте эту лямбда-функцию:

>>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s)
>>> s = raw_input()
I'm "stuck" :\
>>> print s
I'm "stuck" :\
>>> print escape(s, "\\", ['"'])
I'm \"stuck\" :\\
Спатарь
источник
1

Это не так уж и сложно:

def escapeSpecialCharacters ( text, characters ):
    for character in characters:
        text = text.replace( character, '\\' + character )
    return text

>>> escapeSpecialCharacters( 'I\'m "stuck" :\\', '\'"' )
'I\\\'m \\"stuck\\" :\\'
>>> print( _ )
I\'m \"stuck\" :\
совать
источник
3
Если обратная косая черта одна из charactersних, лучше быть первой!
Steveha 06
0

Если вы хотите заменить только некоторые символы, вы можете использовать это:

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
Кристоф Рёдер
источник