Escapado de caracteres especiales en expresiones regulares de Python
Supongamos que necesitamos hacer que un carácter especial se represente a sí mismo. Para ello debe ser escapado usando la barra invertida. Veamos algunos ejemplos.
Ejemplo
En el siguiente ejemplo, el autor de la expresión regular quería
que el patrón de búsqueda se viera así: letra
'a', luego un signo más '+', luego
letra 'x'. Sin embargo, el autor del código
no escapó el carácter '+' y por lo tanto
el patrón de búsqueda en realidad se ve así:
letra 'a' una o más veces,
luego letra 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Resultado de la ejecución del código:
'a+x ! ! !'
Ejemplo
Y ahora el autor escapó el signo más con la barra invertida.
Ahora el patrón de búsqueda se ve como
debería: letra 'a', luego signo más
'+', luego letra 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Resultado de la ejecución del código:
'! ax aax aaax'
Ejemplo
En este ejemplo, el patrón se ve así:
letra 'a', luego punto '.',
luego letra 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Resultado de la ejecución del código:
'! abx azx'
Ejemplo
En el siguiente ejemplo, el autor olvidó escapar el punto y bajo la expresión regular cayeron todas las subcadenas, ya que un punto sin escapar representa cualquier carácter:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Resultado de la ejecución del código:
'! ! !'
Observación
Preste atención al hecho de que si olvida la barra invertida para el punto (cuando debe representarse a sí mismo) - esto puede incluso pasar desapercibido:
res = re.sub('a.x', '!', 'a.x')
print(res) # devuelve '!', como queríamos
Visualmente funciona correctamente (ya que el punto
representa cualquier carácter, incluyendo el
punto ordinario '.'). Pero si cambiamos
la cadena en la que se realizan los reemplazos -
veremos nuestro error:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # devuelve '! ! !', pero se esperaba '! abx azx'
Lista de caracteres especiales y ordinarios
Si se escapa un carácter ordinario - no pasará nada malo - seguirá representándose a sí mismo. La excepción - los dígitos, no se pueden escapar.
A menudo surge la duda de si un carácter dado es especial. Algunos llegan a escapar todos los caracteres sospechosos seguidos. Sin embargo, esta es una mala práctica (ensucia la expresión regular con barras invertidas).
Son caracteres especiales: $ ^ . * + ? \ / {} [] () |
No son caracteres especiales: @ : , ' " - _ = < > % # ~ `& !
Tareas prácticas
Dada la cadena:
txt = 'a.a aba aea'
Escriba una expresión regular que encuentre la cadena
'a.a', sin capturar las demás.
Dada la cadena:
txt = '2+3 223 2223'
Escriba una expresión regular que encuentre la cadena
'2+3', sin capturar las demás.
Dada la cadena:
txt = '23 2+3 2++3 2+++3 345 567'
Escriba una expresión regular que encuentre las cadenas
'2+3', '2++3', '2+++3',
sin capturar las demás (+ puede ser cualquier
cantidad).
Dada la cadena:
txt = '23 2+3 2++3 2+++3 445 677'
Escriba una expresión regular que encuentre las cadenas
'23', '2+3', '2++3',
'2+++3', sin capturar las demás.
Dada la cadena:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Escriba una expresión regular que encuentre las cadenas
'*q+', '*qq+', '*qqq+',
sin capturar las demás.
Dada la cadena:
txt = '[abc] {abc} abc (abc) [abc]'
Escriba una expresión regular que encuentre las cadenas
entre corchetes y las reemplace por
'!'.