re.sub('a(b)','d','abc')
donne dc
, pas adc
.
Pourquoi re.sub
remplacer tout le groupe de capture, au lieu de simplement capturer le groupe '(b)'?
Parce qu'il est censé remplacer toute l'occurrence du motif:
Renvoie la chaîne obtenue en remplaçant les occurrences non chevauchantes les plus à gauche du motif dans la chaîne par le remplacement de remplacement.
S'il ne devait remplacer que certains sous-groupes, les expressions rationnelles complexes avec plusieurs groupes ne fonctionneraient pas. Il existe plusieurs solutions possibles:
re.sub('ab', 'ad', 'abc')
- mon préféré, car il est très lisible et explicite.re.sub('(a)b', r'\1d', 'abc')
repl
et faites-la traiter l'objet Match
et renvoyer le résultat requis.re.sub('(?<=a)b', r'd', 'abxb')
renvoie adxb
. Le ?<=
au début du groupe dit "c'est un coup d'oeil".import re
pattern = re.compile(r"I am (\d{1,2}) .*", re.IGNORECASE)
text = "i am 32 years old"
if re.match(pattern, text):
print(
re.sub(pattern, r"Your are \1 years old.", text, count=1)
)
Comme ci-dessus, nous compilons d'abord un modèle d'expression régulière avec un drapeau insensible à la casse.
Ensuite, nous vérifions si le texte correspond au modèle, si c'est le cas, nous référençons le seul groupe dans le modèle d'expression régulière (âge) avec le numéro de groupe\1.