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'
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)
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)
Essaye ça:
p.sub('gray \g<1>',s)
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é.