grupa python re.sub: liczba po \ liczba

183

Jak mogę wymienić foobarz foo123bar?

To nie działa:

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

To działa:

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

Myślę, że jest to powszechny problem, gdy coś takiego ma \number. Czy ktoś może mi podpowiedzieć, jak sobie z tym poradzić?

zhigang
źródło
2
To pytanie zostało dodane do często zadawanych pytań związanych z przepełnieniem stosu w sekcji „Grupy”.
aliteralmind
1
znalezienie tego pytania zajęło mi sporo czasu, ponieważ nie zawiera ono pojęć „grupa przechwytywania” lub „odniesienie do grupy numerowanej”, ale w końcu tu jestem i cieszę się, że je zadałeś.
Mark Ch
1
Problem polega na tym, że r \ \ 112 jest interpretowany jako ósemkowy literał 0112, ASCII 'J lub dziesiętny 74. Nie widzę, jak wymusić, by odwołanie wsteczne' \ 1 'zostało ocenione przed konkatenacją łańcucha lub''.join()
smci
małe odchylenie od pytania, jakikolwiek sposób na odniesienie wszystkich dopasowań grupowych, tj. r '\ <dla wszystkich dopasowań> cześć?
Sayan Dey

Odpowiedzi:

312

Odpowiedź to:

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

Odpowiedni fragment dokumentów:

Oprócz znaków zmiany znaczenia i odwołań wstecznych, jak opisano powyżej, \ g użyje podłańcucha dopasowanego przez grupę o nazwie nazwa, zgodnie ze składnią (? P ...). \ g używa odpowiedniego numeru grupy; \ g <2> jest zatem równoważne z \ 2, ale nie jest dwuznaczne w zastępstwie takim jak \ g <2> 0. \ 20 byłoby interpretowane jako odniesienie do grupy 20, a nie odniesienie do grupy 2, po której następuje dosłowny znak „0”. Odwołanie wsteczne \ g <0> zastępuje w całym podciągu dopasowanym przez RE.

John Gaines Jr.
źródło
48
Nie bądź dla siebie taki surowy. Jest głęboko ukryty w dokumentacji , że przeczytanie dokumentów zajęłoby większości ludzi dużo więcej czasu niż wyszukanie w Google ich pytań i uzyskanie odpowiedzi na SO.
Speedplane
1
Dokładny cytat znajduje się tutaj na wypadek, gdybyś szukał kontekstu
Patrick
Czy mogę wziąć grupę i zmodyfikować ją? \ g <1> ... Na przykład w tym przypadku g <1> to foo, ale chcę zmienić o u, na przykład ten „fuu”
Eric Bellet