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.

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.