Python Regex natychmiast zastępuje grupy

106

Czy istnieje sposób bezpośredniego zastąpienia wszystkich grup przy użyciu składni wyrażenia regularnego?

Normalny sposób:

re.match(r"(?:aaa)(_bbb)", string1).group(1)

Ale chcę osiągnąć coś takiego:

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

Chcę natychmiast zbudować nowy ciąg z grup, które właśnie przechwycił Regex.

mc_kaiser
źródło

Odpowiedzi:

189

Spójrz na re.sub:

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

To jest funkcja podstawiania (zamiany) wyrażeń regularnych w Pythonie. Ciąg zastępujący może być wypełniony tak zwanymi odwołaniami wstecznymi (ukośnik odwrotny, numer grupy), które są zastępowane tym, co zostało dopasowane przez grupy. Grupy liczone są tak samo, jak w przypadku group(...)funkcji, tj. Zaczynając od 1, od lewej do prawej, otwierając nawiasy.

Martin Ender
źródło
4
O wiele bardziej przejrzyste niż dokument! Nie rozumiem, jak grupa pracowała z tym. Powinni dodać taki przykład.
Y0da
zadziałało od pierwszego razu. To całkiem dobry, jasny sposób na wyjaśnienie tego. Dziękuję i czy możesz wyjaśnić, jak podgrupa powinna dzwonić we właściwy sposób w (r(r))r((r)((r)r))takiej sytuacji?
Rakshitha Muranga Rodrigo
1
@RakshithaMurangaRodrigo Grupy są ponumerowane od lewej do prawej, według miejsca ich rozpoczęcia. Więc jeśli mogę wstawić numer prawo każdej grupy przed grupą, że będą klasyfikowane: 1(r2(r))r3(4(r)5(6(r)r)).
Martin Ender,
@MartinEnder: Wielkie dzięki!
Rakshitha Muranga Rodrigo
30

Przyjęta odpowiedź jest idealna. Dodałbym, że odniesienie do grupy jest prawdopodobnie lepiej osiągnięte przy użyciu następującej składni:

r"\g<1> \g<2>"

dla ciągu zastępczego. W ten sposób można obejść ograniczenia składniowe, w których po grupie może następować cyfra. Ponownie, to wszystko jest obecne w dokumencie, nic nowego, tylko czasami trudne do zauważenia na pierwszy rzut oka.

benelgiac
źródło