2011-09-20 15 views
6

Estoy tratando de encontrar la funcionalidad en Python similar al escaneo de la función Ruby. Mi objetivo es tomar todo el texto entre dos llaves en una lista. Si hay múltiples pares de llaves en la cadena, quiero tener múltiples entradas en la lista.Python Regex Capture Only Certain Text

Cuando ejecuto este código:

match = re.search(r'\{(.+)\}', request.params['upsell']) 
print match.group() 

que coincidan con el texto correcto. Sin embargo, lo que se captura incluye las llaves. No quiero incluir este texto, quiero incluir todo en el medio, pero no las llaves ¡Gracias!

Respuesta

9
re.findall(r'\{(.+?)\}', request.params['upsell']) 

Esto devolverá una lista donde cada entrada es el contenido de un grupo diferente de llaves. Tenga en cuenta que esto no funcionará para llaves anidadas.

El ? después del .+ lo convertirá en un partido perezoso (en lugar de codicioso). Esto significa que la coincidencia se detendrá en el primer "}", en lugar de continuar coincidiendo con tantos caracteres como sea posible y terminando en el último paréntesis de cierre.

re.findall() buscará a través de su cadena y encontrará todas las coincidencias no superpuestas, y devolverá el grupo. Alternativamente, puede usar re.finditer() que iterará sobre los objetos Match, pero luego deberá usar match.group(1) para obtener solo lo que está dentro de los paréntesis. Esto también es lo que necesitaría cambiar en su ejemplo, match.group() devuelve la coincidencia completa, no el grupo capturado, para eso debe ingresar el número del grupo que desea.

1
>>> import re 
>>> re.findall(r'{([^{}]*)}', '{a} { {b} c { {d} } }') 
['a', 'b', 'd'] 
9

Use group(1), o lookbehinds/aheads. (También, asegúrese de tomar el consejo de F. J. y J. F. y utilizar .+? o [^{}]*

import re 
match = re.search(r'\{(.+)\}', "asdfasd {asdf}asdfasdf") 
print match.group(1) 

o con lookbehinds/aheads:

import re 
match = re.search(r'(?<=\{)(.+)(?=\})', "asdfasd {asdf}asdfasdf") 
print match.group()