Python Regex remplace instantanément les groupes

106

Existe-t-il un moyen 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 créer la nouvelle chaîne instantanément à partir des groupes que le Regex vient de capturer.

mc_kaiser
la source

Réponses:

189

Jetez un œil à re.sub:

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

Il s'agit de la fonction de substitution (remplacement) d'expression régulière de Python. La chaîne de remplacement peut être remplie avec ce que l'on appelle des références inverses (barre oblique inverse, 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 group(...)fonction, c'est-à-dire à partir de 1, de gauche à droite, en ouvrant les parenthèses.

Martin Ender
la source
4
Bien plus clair que la doc! Je n'ai pas compris comment le groupe travaillait avec celui-ci. Ils devraient ajouter un tel exemple.
Y0da
cela a fonctionné dès la première fois, c'est une très bonne façon claire de l'expliquer. Merci et pouvez-vous expliquer comment le sous-groupe devrait appeler correctement une sorte de (r(r))r((r)((r)r))situation?
Rakshitha Muranga Rodrigo
1
@RakshithaMurangaRodrigo Les groupes sont numérotés de gauche à droite, en passant par là où ils commencent. Donc , si j'insérer devant le numéro de groupe de chaque groupe droit, ils seraient classés: 1(r2(r))r3(4(r)5(6(r)r)).
Martin Ender
@MartinEnder: Merci beaucoup!
Rakshitha Muranga Rodrigo
30

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

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

pour la chaîne de remplacement. De cette façon, 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.

benelgiac
la source