2010-11-17 2 views
83

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

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

+2

Что вы считаете специальный персонаж? – pafcu

+0

«,» и \ ... не так ли? – Wolfy

+1

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

ответ

129

Использование 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 (строка)

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

+12

Это ускользает, хотя, возможно, это не так полезно. – poke

+0

@poke: вы смотрите на некоторые особые случаи. вам не нужно отслеживать ваши специальные символы. – pyfunc

+1

Все в порядке, я просто хотел упомянуть, что это может сделать слишком много :) – poke

2

Это не так уж трудно:

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\" :\ 
+2

Если обратная косая черта является одним из символов, лучше было бы первым! – steveha

9

Использование магнезии() [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]' –

+0

В python3.4, где все строки являются unicode, это не похоже на работа на всех, к сожалению. Вместо этого 'print (repr (« Я застрял ») [1: -1])' prints 'Я застрял'. – dantiston

15

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

Как было указано выше, ответ зависит от вашего дела. Если вы хотите избежать строки для 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\" :\\ 
2

Если вы хотите заменить некоторые символы можно использовать следующим образом:

import re 

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.") 
Смежные вопросы