Есть ли в Python функция, которую я могу использовать для экранирования специальных символов в регулярном выражении?
Например, I'm "stuck" :\
должно стать I\'m \"stuck\" :\\
.
Есть ли в Python функция, которую я могу использовать для экранирования специальных символов в регулярном выражении?
Например, I'm "stuck" :\
должно стать I\'m \"stuck\" :\\
.
Ответы:
использование 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()
был изменен, чтобы экранировать только символы, которые имеют значение для операций с регулярными выражениями.
regex.escape(pattern,string,special_only=True
Я удивлен, что никто не упомянул использование регулярных выражений через 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'
- а это никому не нужно .Используйте 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" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
печатает I'm stuck
.
Как уже было сказано выше, ответ зависит от вашего случая. Если вы хотите экранировать строку для регулярного выражения, вам следует использовать 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\" :\\
Это не так уж и сложно:
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\" :\
characters
них, лучше быть первой!
Если вы хотите заменить только некоторые символы, вы можете использовать это:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")