Escapar de caracteres especiales de expresiones regulares en una cadena de Python

126

¿Python tiene una función que pueda usar para escapar de caracteres especiales en una expresión regular?

Por ejemplo, I'm "stuck" :\debería convertirse I\'m \"stuck\" :\\.

Wolfy
fuente
2
¿Qué consideras que es un personaje especial?
pafcu
1
Depende completamente de tu contexto. Por lo general, esos caracteres están totalmente bien cuando los tienes dentro de una cadena.
meter
posible duplicado de la cadena de
expresiones

Respuestas:

197

Utilizar 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

Repitiéndolo aquí:

re.escape (cadena)

Cadena de retorno con todos los caracteres no alfanuméricos invertidos; Esto es útil si desea hacer coincidir una cadena literal arbitraria que puede tener metacaracteres de expresión regular.

A partir de Python 3.7 re.escape()se cambió para escapar solo de los caracteres que son significativos para las operaciones de expresiones regulares.

pyfunc
fuente
1
Puede usar el módulo regex en lugar de re. Un ejemplo sería regex.escape(pattern,string,special_only=True
Lokinou el
17

Me sorprende que nadie haya 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 patrón de búsqueda , incluya \también los caracteres que está buscando. Vas a usar \para escapar de tus personajes, por lo que también debes escapar de eso .
  • Ponga paréntesis alrededor del patrón de búsqueda , por ejemplo ([\"]), para que el patrón de sustitución pueda usar el carácter encontrado cuando se agrega \delante de él. (Eso es lo que \1hace: usa el valor del primer grupo entre paréntesis).
  • El rfrente de r'([\"])'significa que es una cadena cruda . Las cadenas sin formato utilizan diferentes reglas para escapar barras diagonales inversas. Para escribir ([\"])como una cadena simple, necesitaría duplicar todas las barras diagonales inversas y escribir '([\\"])'. Las cadenas sin formato son más amigables cuando escribes expresiones regulares.
  • En el patrón de sustitución , debe escapar \para distinguirlo de una barra diagonal inversa que precede a un grupo de sustitución, por ejemplo \1, por lo tanto r'\\\1'. Para escribir eso como una cadena simple, necesitarías '\\\\\\1', y nadie quiere eso.
Tim Ruddick
fuente
9

Use repr () [1: -1]. En este caso, las comillas dobles no necesitan escaparse. El segmento [-1: 1] es eliminar la comilla simple desde el 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 quieres escapar de una frase para pegarla en tu programa? Si es así, haz esto:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
dp_
fuente
3
Eso no funciona si la cadena es unicode, porque tendrás u y deberías ejecutarrepr(x)[2:-1]
Antoine Pelisse
En python3.4, donde todas las cadenas son unicode, desafortunadamente no parece funcionar en absoluto. En cambio, print(repr("I'm stuck")[1:-1])impresiones I'm stuck.
dantiston
3

Como se mencionó anteriormente, la respuesta depende de su caso. Si desea escapar de una cadena para una expresión regular, debe usar re.escape (). Pero si desea escapar de un conjunto específico de caracteres, utilice 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\" :\\
spatar
fuente
1

No es tan dificil:

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\" :\
dar un toque
fuente
3
Si la barra invertida es una de charactersellas, ¡será mejor que sea la primera!
steveha
0

Si solo desea reemplazar algunos caracteres, puede usar esto:

import re

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