web-dev-qa-db-fra.com

python groupe re.sub: nombre après \ nombre

Comment puis-je remplacer foobar par foo123bar?

Cela ne marche pas:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

Cela marche:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

Je pense que c'est un problème commun quand on a quelque chose comme \number. Quelqu'un peut-il me donner un indice sur la façon de gérer cela?

142
zhigang

La réponse est:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

Extrait pertinent de la documentation:

En plus des caractères d'échappement et des références arrières décrits ci-dessus,\g utilisera la sous-chaîne associée au groupe nommé name, tel que défini par la syntaxe (? P ...).\g utilise le numéro de groupe correspondant;\g <2> est donc équivalent à\2, mais n’est pas ambigu dans un remplacement tel que\g <2> 0.\20 serait interprété comme une référence au groupe 20, et non comme une référence au groupe 2 suivi du caractère littéral "0". La référence arrière\g <0> se substitue dans la sous-chaîne entière mise en correspondance par le RE.

255
John Gaines Jr.