web-dev-qa-db-fra.com

Python Regex remplace instantanément les groupes

Est-il possible de remplacer directement tous les groupes en utilisant la syntaxe regex?

La manière 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 Regex vient de capturer.

76
user1467267

Regardez re.sub :

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

Il s'agit de la fonction de substitution des expressions rationnelles (remplacer) de Python. La chaîne de remplacement peut être remplie de soi-disant références arrières (barre oblique inverse, numéro de groupe) qui sont remplacées par ce qui correspondait aux groupes. Les groupes sont comptés comme dans la fonction group(...), c'est-à-dire à partir de 1, De gauche à droite, en ouvrant des parenthèses.

136
Martin Ender

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

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

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

20
benelgiac