108 votes

Regexes: Comment accéder à plusieurs correspondances d'un groupe?

Je suis en train de mettre en place une expression régulière assez complexe. Une partie de l'expression correspond à des chaînes telles que '+a', '-57', etc. Un + ou un - suivi de n'importe quel nombre de lettres ou de chiffres. Je veux faire correspondre 0 ou plusieurs chaînes correspondant à ce modèle.

Voici l'expression à laquelle je suis arrivé:

([\+-][a-zA-Z0-9]+)*

Si je devais chercher la chaîne '-56+a' en utilisant ce modèle, je m'attendrais à obtenir deux correspondances:

+a et -56

Cependant, je n'obtiens que la dernière correspondance renvoyée:

>>> m = re.match("([\+-][a-zA-Z0-9]+)*", '-56+a')
>>> m.groups()
('+a',)

En regardant la documentation Python, je vois que:

Si un groupe correspond plusieurs fois, seule la dernière correspondance est accessible:

>>> m = re.match(r"(..)+", "a1b2c3")  # Correspond 3 fois.
>>> m.group(1)                        # Renvoie uniquement la dernière correspondance.
'c3'

Donc, ma question est : comment accédez-vous à plusieurs correspondances de groupe?

87voto

phooji Points 5692

Supprimez le * de votre regex (afin qu'il corresponde exactement à une instance de votre modèle). Ensuite, utilisez soit re.findall(...) ou re.finditer (voir ici) pour obtenir tous les correspondances.

On dirait que vous construisez essentiellement un analyseur descendant récursif. Pour des tâches d'analyse relativement simples, il est assez commun et tout à fait raisonnable de le faire à la main. Si vous êtes intéressé par une solution de bibliothèque (au cas où votre tâche d'analyse pourrait devenir plus compliquée par la suite, par exemple), jetez un oeil à pyparsing.

53voto

Eric Points 36290

Le module regex corrige cela en ajoutant une méthode .captures :

>>> m = regex.match(r"(..)+", "a1b2c3")
>>> m.captures(1)
['a1', 'b2', 'c3']

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