Debe tener cuidado al insertar cadenas en un patrón de expresiones regulares.
Esto se debe a que la cadena puede contener special regexp characters que puede provocar errores o dar resultados inesperados.
Para dar un ejemplo:
>>> import re
>>> s = 'one*two*three*four*five'
>>> t = '*f'
>>> r = re.compile(r'%s\w+' % t)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/re.py", line 190, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.7/re.py", line 244, in _compile
raise error, v # invalid expression
sre_constants.error: nothing to repeat
Esta falla porque la cadena insertada contiene *
, que es una expresión regular carácter especial.
Sin embargo, este problema puede abordarse mediante el uso de la función re.escape
en la cadena insertada:
>>> r = re.compile(r'%s\w+' % re.escape(t))
>>> r.findall(s)
['*four', '*five']
De hecho, dudo que una expresión regular que comienza por dos estrellas y terminando por dos estrellas es una validez de un –
Como una nota a las respuestas solo quiere agregar, debe prestar mucha atención al valor de la variable, ya que podría tratarse como expresiones regulares, dando un resultado incorrecto después de aplicar esta expresión regular. – demalexx
[** Esta pregunta **] (http://stackoverflow.com/questions/6930982/variable-inside-python-regex) es similar a la tuya. Puede ser de ayuda. –