python re.sub group: nummer nach \ nummer

183

Wie kann ich ersetzen foobarmit foo123bar?

Das funktioniert nicht:

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

Das funktioniert:

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

Ich denke, es ist ein häufiges Problem, wenn man so etwas hat \number. Kann mir jemand einen Hinweis geben, wie ich damit umgehen soll?

Zhigang
quelle
2
Diese Frage wurde zu den häufig gestellten Fragen zum Stapelüberlauf für reguläre Ausdrücke unter "Gruppen" hinzugefügt .
Aliteralmind
1
Es hat ziemlich lange gedauert, diese Frage zu finden, da sie nicht die Begriffe "Erfassungsgruppe" oder "nummerierte Gruppenreferenz" enthält, aber ich bin irgendwann hier und froh, dass Sie sie gestellt haben.
Mark Ch
1
Ihr Problem ist, dass r '\ 112' als Oktalliteral 0112, ASCII'J 'oder Dezimalzahl 74 interpretiert wird. Ich kann nicht sehen, wie die Rückreferenz' \ 1 'gezwungen wird, vor der Verkettung von Zeichenfolgen ausgewertet zu werden, oder''.join()
smci
eine kleine Abweichung von der Frage, eine Möglichkeit, alle Gruppenspiele zu referenzieren, dh r '\ <für alle Übereinstimmungen> hi'?
Sayan Dey

Antworten:

312

Die Antwort ist:

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

Relevanter Auszug aus den Dokumenten:

Zusätzlich zu den oben beschriebenen Escapezeichen und Rückreferenzen von Zeichen verwendet \ g die Teilzeichenfolge, die mit der Gruppe namens name übereinstimmt, wie in der Syntax (? P ...) definiert. \ g verwendet die entsprechende Gruppennummer; \ g <2> entspricht daher \ 2, ist jedoch bei einem Ersatz wie \ g <2> 0 nicht mehrdeutig. \ 20 würde als Verweis auf Gruppe 20 interpretiert, nicht als Verweis auf Gruppe 2, gefolgt vom Literalzeichen '0'. Die Rückreferenz \ g <0> ersetzt den gesamten Teilstring, der mit dem RE übereinstimmt.

John Gaines Jr.
quelle
48
Sei nicht so hart zu dir. Es ist so tief in der Dokumentation vergraben, dass die meisten Leute viel mehr Zeit benötigen würden, um die Dokumente zu lesen, als ihre Frage zu googeln und diese Antwort auf SO zu bekommen.
Speedplane
1
Das genaue Zitat finden Sie hier, falls Sie nach Kontext suchen
Patrick