2011-12-29 7 views
6

Me gustaría combinar una variable y un patrón de python. ¿Cómo puedo hacerlo?Python regex: combinación de un formato de patrón de re con una variable

a continuación es lo que me gustaría hacer.

re.search(r'**some_variable+pattern**',str_for_pattern_match,flags) 

Gracias por su ayuda.

+0

De hecho, dudo que una expresión regular que comienza por dos estrellas y terminando por dos estrellas es una validez de un –

+0

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

+0

[** Esta pregunta **] (http://stackoverflow.com/questions/6930982/variable-inside-python-regex) es similar a la tuya. Puede ser de ayuda. –

Respuesta

4
re.search(r'**{0}+pattern**'.format(variable_name), str_for_pattern_match, flags) 

ahora toda su {…} se interpretará como string format marcadores de posición.

+3

Una cosa a tener en cuenta, sin embargo: si la variable tiene metacaracteres especiales, se tomarán como están ... Si no es deseado, uno podría querer rodear el marcador de posición con '\ Q' y' \ E': 'r ' \ Q {0} \ E ' – fge

14

La cadena habitual de formatear manera funciona bien

re.search(r'**%s+pattern**' % some_variable, str_for_pattern_match, flags) 
5

patrones de expresiones regulares no son algo muy especial que Python trata especialmente. Un patrón es simplemente un valor de cadena perfectamente normal, que el módulo re interpretará como un patrón.

Entonces la pregunta no es "¿cómo puedo usar una variable en un patrón?", Sino "¿cómo puedo construir una cadena basada en una variable?".

Los documentos de Python tienen mucha información sobre cómo hacer esto. Particularmente útil será la documentación en string methods. El más importante de estos con el fin de construir expresiones regulares probablemente sea probablemente str.format (como se demostró en la respuesta de eumiro), que tiene a large section of its own que describe cómo formatear tipos de datos básicos en cadenas de plantillas de casi cualquier forma que usted desee.

Si puedes dominar las operaciones básicas en las cadenas, ¡pegar una variable en una expresión regular será lo menos que puedes hacer!

3

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'] 
Cuestiones relacionadas