209 votes

Python non-greedy regexes

Comment faire un regex de python comme "(.*)" tel que, étant donné que "a (b) c (d) e" python correspond "b" au lieu de "b) c (d" ?

Je sais que je peux utiliser "[^)]" au lieu de ".", mais je suis à la recherche d'une solution plus générale qui garde mon regex un peu plus propre. Est-ce qu'il y a un moyen de dire à Python "hé, assortissez ça dès que possible" ?

305voto

Trey Stout Points 1593

Vous recherchez le tout-puissant *?

Des docs, Greedy versus Non-Greedy

les qualificatifs non gourmands *?, +?, ??, ou {m,n}? [...] correspondent aussi peu de texte que possible.

16voto

Zitrax Points 3443

Est-ce que \\(.*?\\) ne fonctionnerait pas ? C'est la syntaxe non gourmande.

7voto

David Berger Points 5459

Voulez-vous qu'il corresponde à "(b)" ? Faites ce que Zitrax et Paolo ont suggéré. Voulez-vous qu'il corresponde à "b" ? Faire

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

7voto

ojrac Points 6897

L'utilisation d'un match non gourmand est un bon début, mais je vous suggère également de reconsidérer toute utilisation de .* -- qu'en est-il de cela ?

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X