2010-11-17 51 views
83

¿Tiene Python una función que puedo usar para escapar caracteres especiales en una expresión regular?Caracteres especiales de escape de Python

Por ejemplo, I'm "stuck" :\ debe convertirse en I\'m \"stuck\" :\\.

+2

¿Cuáles considera a ser un especial ¿personaje? – pafcu

+0

', "y \ ... ¿no? – Wolfy

+1

Totalmente depende de su contexto. Generalmente esos caracteres están totalmente bien cuando los tiene dentro de una cadena. – poke

Respuesta

129

Uso 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 

Ver: http://docs.python.org/library/re.html#module-contents

Repitiendo aquí:

re.escape (cadena)

cadena devuelta con todos los no-alfanuméricos con barras invertidas ; esto es útil si desea hacer coincidir una cadena literal arbitraria que puede tener metacaracteres de expresiones regulares en ella.

+12

Aunque se escapa mucho, lo que podría no ser tan útil. – poke

+0

@poke: Estás viendo algunos casos especiales. Todo lo demás funciona bien y no es necesario que rastree sus caracteres especiales. – pyfunc

+1

Está bien, solo quería mencionar que podría hacer demasiado :) – poke

2

No es que duro:

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

Si la barra invertida es uno de los 'caracteres', ¡será mejor que sea el primero! – steveha

9

Uso repr() [1: -1]. En este caso, las comillas dobles no necesitan ser escapadas. El segmento [-1: 1] es para eliminar la comilla simple del principio y el final.

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

¿O tal vez solo quiere escapar de una frase para pegar en su programa? Si es así, haga lo siguiente:

>>> raw_input() 
I'm "stuck" :\ 
'I\'m "stuck" :\\' 
+3

Eso no funciona si la cadena es unicode, porque tendrá uy debería ejecutar 'repr (x) [2: -1]' –

+0

En python3.4, donde todas las cadenas son unicode, esto no parece trabajo en absoluto, por desgracia. En cambio, 'print (repr (" Estoy atascado ") [1: -1])' imprime 'Estoy atascado'. – dantiston

15

Me sorprende que nadie ha mencionado el uso de expresiones regulares a través de 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\" 

cosas importantes a tener en cuenta:

  • En el búsqueda patrón, incluya \, así como los caracteres que está buscando. Va a estar utilizando \ para escapar de sus caracteres, por lo que debe escapar que también.
  • Ponga paréntesis alrededor del patrón de búsqueda , p. Ej. ([\"]), para que el sustitución patrón puede utilizar el carácter encontrado cuando se agrega \ en frente de él. (Eso es lo que hace \1: utiliza el valor del primer grupo entre paréntesis.)
  • El r frente a r'([\"])' significa que es una cadena de texto en . Las cadenas sin formato usan diferentes reglas para escapar de las barras diagonales inversas. Para escribir ([\"]) como una cadena simple, necesitaría doblar todas las barras diagonales inversas y escribir '([\\"])'. Las cadenas sin formato son más amigables cuando estás escribiendo expresiones regulares.
  • En el patrón de sustitución, debe escapar de \ para distinguirlo de una barra invertida que precede a un grupo de sustitución, p.\1, de ahí r'\\\1'. Para escribir que como cadena simple, necesitaría '\\\\\\1' — y nadie quiere eso.
3

Como se mencionó anteriormente, la respuesta depende de su caso. Si desea escapar de la cadena para la expresión regular, entonces debe usar re.escape(). Pero si quieres escapar conjunto específico de caracteres a continuación, utilizar esta función lambda:

>>> 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

Si sólo desea reemplazar algunos caracteres que usted podría utilizar esto:

import re 

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.") 
Cuestiones relacionadas