152 votes

Python Regex remplacer instantanément des groupes

Existe-t-il un moyen de remplacer directement tous les groupes en utilisant la syntaxe regex ?

La voie normale :

re.match(r"(?:aaa)(_bbb)", string1).group(1)

Mais je veux réaliser quelque chose comme ça :

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

Je veux construire la nouvelle chaîne instantanément à partir des groupes que la Regex vient de capturer.

267voto

Martin Büttner Points 26511

Jetez un coup d'œil à re.sub :

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

Il s'agit de la fonction de substitution (replace) de regex de Python. La chaîne de remplacement peut être remplie de ce que l'on appelle des rétro-références (backslash, numéro de groupe) qui sont remplacées par ce qui a été mis en correspondance par les groupes. Les groupes sont comptés de la même manière que par la fonction group(...) c'est-à-dire en partant de 1 de gauche à droite, en ouvrant les parenthèses.

61voto

benelgiac Points 641

La réponse acceptée est parfaite. J'ajouterais que la référence de groupe est probablement mieux réalisée en utilisant cette syntaxe :

r"\g<1> \g<2>"

pour la chaîne de remplacement. De cette façon, vous contournez les limitations syntaxiques lorsqu'un groupe peut être suivi d'un chiffre. Encore une fois, tout cela est présent dans la doc, rien de nouveau, mais parfois difficile à repérer à première vue.

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