Expresiones regulares no codiciosas de Python

¿Cómo puedo hacer una expresión regular de python como “(. *)” De manera que, dado “py (e) a (b) c (d) e”, coincida con “b” en lugar de “b) c (d”?

Sé que puedo usar “[^)]” en lugar de “.”, Pero estoy buscando una solución más general que mantenga mi expresión regular un poco más limpia. ¿Hay alguna manera de decirle a Python “oye, empareja esto lo más pronto posible”?

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

De acuerdo con los documentos :

El ‘ * ‘, ‘ + ‘ y ‘ ? ‘los calificadores son todos codiciosos; coinciden con la mayor cantidad de texto posible. Algunas veces este comportamiento no es deseado; si RE < .*> coincide con ‘

title

‘, coincidirá con toda la cadena, y no solo con ‘

‘. 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. Usando .*? en la expresión anterior solo coincidirá con ‘

‘.

¿No funcionaría \\(.*?\\) ? Esa es la syntax no codiciosa.

Como los otros han dicho usando el? 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.

¿Quieres 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' 

Usar un partido no sangriento es un buen comienzo, pero también sugiero que reconsideres cualquier uso de .* – ¿Qué tal esto?

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