python re.sub group: numero dopo \ numero


183

Come posso sostituire foobarcon foo123bar?

Questo non funziona:

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

Questo funziona:

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

Penso che sia un problema comune quando si ha qualcosa di simile \number. Qualcuno può darmi un suggerimento su come gestirlo?


2
Questa domanda è stata aggiunta alle FAQ sulle espressioni regolari di Stack Overflow , in "Gruppi".
aliteralmind

1
questa domanda mi ha impiegato molto tempo per trovare, perché non contiene i termini "gruppo di acquisizione" o "riferimento al gruppo numerato", ma alla fine sono qui e sono felice che tu l'abbia chiesto.
Mark Ch,

1
Il tuo problema è che r '\ 112' viene interpretato come il letterale ottale 0112, ASCII'J 'o decimale 74. Non riesco a vedere come forzare il backreference' \ 1 'per essere valutato prima della concatenazione di stringhe o''.join()
smci

una piccola deviazione dalla domanda, un modo per fare riferimento a tutte le partite del gruppo cioè r '\ <per tutte le partite> ciao'?
Sayan Dey,

Risposte:


313

La risposta è:

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

Estratto pertinente dai documenti:

Oltre alle fughe di caratteri e alle backreferenze come descritto sopra, \ g utilizzerà la sottostringa corrispondente al nome del gruppo, come definito dalla sintassi (? P ...). \ g utilizza il numero di gruppo corrispondente; \ g <2> è quindi equivalente a \ 2, ma non è ambiguo in una sostituzione come \ g <2> 0. \ 20 verrebbe interpretato come un riferimento al gruppo 20, non come un riferimento al gruppo 2 seguito dal carattere letterale "0". Il backreference \ g <0> sostituisce l'intera sottostringa a cui corrisponde RE.


48
Non essere così duro con te stesso. È sepolto nella documentazione così in profondità che la maggior parte delle persone impiegherebbe molto più tempo a leggere i documenti che a google la loro domanda e ottenere questa risposta su SO.
speedplane

1
La citazione esatta fornita si trova qui nel caso in cui si cerchi un contesto
patrick,

Posso prendere il gruppo e modificarlo? \ g <1> ... Ad esempio, in questo caso g <1> è foo, ma voglio cambiare o da te, come questo "fuu"
Eric Bellet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.