¿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\" :\\
.
¿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\" :\\
.
Respuestas:
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.
regex.escape(pattern,string,special_only=True
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:
\
también los caracteres que está buscando. Vas a usar \
para escapar de tus personajes, por lo que también debes escapar de
eso .([\"])
, para que el
patrón de sustitución pueda usar el carácter encontrado cuando se agrega \
delante de él. (Eso es lo que
\1
hace: usa el valor del primer grupo entre paréntesis).r
frente 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.\
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.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" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
impresiones I'm stuck
.
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\" :\\
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\" :\
characters
ellas, ¡será mejor que sea la primera!
Si solo desea reemplazar algunos caracteres, puede usar esto:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")