2009-04-19 28 views
79

¿Cómo hago una expresión regular pitón como "(. *)" De tal manera que, dada "a (b) c (d) e" partidos pitón "b" en lugar de "b) c (d "?Python expresiones regulares no codiciosos

sé que puedo usar '[^)]' en lugar de". ", pero estoy buscando una solución más general que mantiene mi expresión regular un poco más limpio. ¿Hay alguna manera de decirle a Python "oye, empareja esto lo más pronto posible"?

Respuesta

11

¿No sería \\(.*?\\) trabajo? Esa es la sintaxis no codiciosa.

51
>>> x = "a (b) c (d) e" 
>>> re.search(r"\(.*\)", x).group() 
'(b) c (d)' 
>>> re.search(r"\(.*?\)", x).group() 
'(b)' 

According to the docs:

El '*', '+', y '' ? calificadores son codiciosos; coinciden con la mayor cantidad de texto posible. Algunas veces este comportamiento no es deseado; si el RE <.*> se compara con '<H1>title</H1>', que coincidirá con la cadena entera, y no sólo '<H1>'. Agregar '?' después de que el calificador lo haga realizar el partido de manera no codiciosa o mínima; se emparejarán los pocos caracteres posibles. El uso de .*? en la expresión anterior solo coincidirá con '<H1>'.

+1

[Nunca analizar HTML con expresiones regulares] (https://stackoverflow.com/a/1732454) –

2

¿Desea que coincida con "(b)"? Haz lo que han sugerido Zitrax y Paolo. ¿Quieres que coincida con "b"? Hacer

>>> x = "a (b) c (d) e" 
>>> re.search(r"\((.*?)\)", x).group(1) 
'b' 
2

utilizando un partido ungreedy es un buen comienzo, pero me gustaría también sugieren que reconsiderar cualquier uso de .* - ¿qué pasa con esto?

groups = re.search(r"\([^)]*\)", x) 
5

Como han dicho los otros usando? el modificador en el * cuantificador resolverá tu problema inmediato, pero ten cuidado, estás empezando a deslizarte hacia áreas donde las expresiones regulares dejan de funcionar y necesitas un analizador en su lugar. Por ejemplo, la cadena "(foo (bar)) baz" le causará problemas.

Cuestiones relacionadas