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


126

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

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


2
Что вы считаете особенным персонажем?
pafcu

1
Полностью зависит от вашего контекста. Обычно эти символы совершенно нормальны, когда они находятся внутри строки.
poke

Ответы:


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


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" :\\'

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.")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.