web-dev-qa-db-fra.com

Comment utiliser python regex pour remplacer en utilisant le groupe capturé?

Supposons que je veuille changer the blue dog and blue cat wore blue hats à 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 faire 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'
48
Eric Wilson

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)
60
mac

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)
20
justcompile

Essaye ça:

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

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 inversée littérale, plus un index basé sur un pour effectuer des remplacements de groupe de capture numérotés, comme indiqué dans cet exemple. Donc \1, entré comme '\\1', référence le premier groupe de capture (\d), et \2 le deuxième groupe capturé.

5
ThorSummoner