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.

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.