python re.sub group: numéro après \ number

183

Comment puis-je remplacer foobarpar foo123bar?

Cela ne fonctionne 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 courant lorsqu'on a quelque chose comme \number. Quelqu'un peut-il me donner un indice sur la façon de gérer cela?

zhigang
la source
2
Cette question a été ajoutée à la FAQ sur les expressions régulières Stack Overflow , sous "Groupes".
aliteralmind
1
il m'a fallu beaucoup de temps pour trouver cette question, car elle ne comporte pas les termes «groupe de capture» ou «référence de groupe numérotée», mais je suis finalement là et heureux que vous l'ayez posée.
Mark Ch
1
Votre problème est que r '\ 112' est interprété comme le littéral octal 0112, ASCII'J 'ou décimal 74. Vous ne voyez pas comment forcer la référence arrière' \ 1 'à être évaluée avant la concaténation de chaînes ou''.join()
smci
un petit écart par rapport à la question, de toute façon de faire référence à toutes les correspondances de groupe, c'est-à-dire r '\ <pour toutes les correspondances> salut'?
Sayan Dey

Réponses:

313

La réponse est:

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

Extrait pertinent de la documentation:

En plus des échappements de caractères et des références arrière comme décrit ci-dessus, \ g utilisera la sous-chaîne correspondant au groupe nommé name, comme défini par la syntaxe (? P ...). \ g utilise le numéro de groupe correspondant; \ g <2> équivaut donc à \ 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 suivie du caractère littéral «0». La référence arrière \ g <0> se substitue à la sous-chaîne entière mise en correspondance par l'ER.

John Gaines Jr.
la source
48
Ne soyez pas si dur avec vous-même. Il est si profondément enfoui dans la documentation qu'il faudrait à la plupart des gens beaucoup plus de temps pour lire les documents que pour rechercher leur question sur Google et obtenir cette réponse sur SO.
speedplane
1
La citation exacte fournie se trouve ici au cas où vous recherchez un contexte
patrick
Puis-je prendre le groupe et le modifier? \ g <1> ... Par exemple dans ce cas, g <1> est foo, mais je veux changer le o par u, comme ce "fuu"
Eric Bellet