Есть ли у Python функция, которую я могу использовать для исключения специальных символов в регулярном выражении?Специальные символы регулярного выражения Python
Например, I'm "stuck" :\
должно быть I\'m \"stuck\" :\\
.
Есть ли у Python функция, которую я могу использовать для исключения специальных символов в регулярном выражении?Специальные символы регулярного выражения Python
Например, I'm "stuck" :\
должно быть I\'m \"stuck\" :\\
.
Использование re.escape
re.escape(string)
>>> re.escape('\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> print(re.escape('\ a.*$'))
\\\ a\.\*\$
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com
См: http://docs.python.org/library/re.html#module-contents
Повторяя его здесь:
re.escape (строка)
Возврат строка всех не буквенно-цифровых символов управляющими последовательностями ; это полезно, если вы хотите совместить произвольную литеральную строку, которая может содержать метасимволы регулярного выражения.
Это не так уж трудно:
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\" :\
Если обратная косая черта является одним из символов, лучше было бы первым! – steveha
Использование магнезии() [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" :\\'
Это не работает, если строка является unicode, потому что вы будете иметь u и должны запускать 'repr (x) [2: -1]' –
В python3.4, где все строки являются unicode, это не похоже на работа на всех, к сожалению. Вместо этого 'print (repr (« Я застрял ») [1: -1])' prints 'Я застрял'. – dantiston
Я удивлен, что никто не упоминал об использовании регулярных выражений с помощью 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'
—, и никто этого не хочет.Как было указано выше, ответ зависит от вашего дела. Если вы хотите избежать строки для regexp, вам следует использовать 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\" :\\
Если вы хотите заменить некоторые символы можно использовать следующим образом:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
Что вы считаете специальный персонаж? – pafcu
«,» и \ ... не так ли? – Wolfy
Полностью зависит от вашего контекста. Обычно эти символы полностью прекрасны, когда у вас есть внутри строки. – poke