74 votes

Comment utiliser python regex pour remplacer à l'aide du groupe capturé?

Supposons que je veuille changer the blue dog and blue cat wore blue hats en the gray dog and gray cat wore blue hats .

Avec sed je pourrais accomplir ceci comme suit :

 $ echo 'the blue dog and blue cat wore blue hats' | sed 's/blue \(dog\|cat\)/gray \1/g'

Comment puis-je effectuer un remplacement similaire en Python ? J'ai essayé:

 >>> import re
>>> s = "the blue dog and blue cat wore blue hats"
>>> p = re.compile(r"blue (dog|cat)")
>>> p.sub('gray \1',s)
'the gray \x01 and gray \x01 wore blue hats'

90voto

mac Points 16282

Vous devez échapper à votre barre oblique inverse :

 p.sub('gray \\1', s)

vous pouvez également utiliser une chaîne brute comme vous l'avez déjà fait pour l'expression régulière :

 p.sub(r'gray \1', s)

32voto

justcompile Points 695

Comme je cherchais une réponse similaire; mais voulant utiliser des groupes nommés dans le remplacement, j'ai pensé ajouter le code pour les autres :

 p = re.compile(r'blue (?P<animal>dog|cat)')
p.sub(r'gray \g<animal>',s)

17voto

ThorSummoner Points 396

Hors sujet, Pour les groupes de capture numérotés :

 #/usr/bin/env python
import re

re.sub(
    pattern=r'(\d)(\w+)', 
    repl='word: \\2, digit: \\1', 
    string='1asdf'
)

word: asdf, digit: 1

Python utilise une barre oblique inverse littérale, plus un index basé sur un pour effectuer des remplacements de groupes de capture numérotés, comme indiqué dans cet exemple. Ainsi, \1 , entré sous la forme '\\1' , fait référence au premier groupe de capture (\d) , et \2 au deuxième groupe capturé.

7voto

CAB Points 975

Essaye ça:

 p.sub('gray \g<1>',s)

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