¿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\" :\\
.
¿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\" :\\
.
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.
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\" :\
Si la barra invertida es uno de los 'caracteres', ¡será mejor que sea el primero! – steveha
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" :\\'
Eso no funciona si la cadena es unicode, porque tendrá uy debería ejecutar 'repr (x) [2: -1]' –
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
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:
\
, así como los caracteres que está buscando. Va a estar utilizando \
para escapar de sus caracteres, por lo que debe escapar que también.([\"])
, 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.)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.\
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.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\" :\\
Si sólo desea reemplazar algunos caracteres que usted podría utilizar esto:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
¿Cuáles considera a ser un especial ¿personaje? – pafcu
', "y \ ... ¿no? – Wolfy
Totalmente depende de su contexto. Generalmente esos caracteres están totalmente bien cuando los tiene dentro de una cadena. – poke