Python Regex моментально замінює групи


106

Чи є спосіб замінити всі групи за допомогою синтаксису регулярних виразів?

Нормальний спосіб:

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

Але я хочу досягти чогось такого:

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

Я хочу створити нову рядок миттєво з груп, які Regex тільки що захопив.

Відповіді:


189

Подивіться на re.sub:

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

Це функція заміщення (заміни) регулярного вираження Python. Рядок заміни може бути заповнений так званими зворотними посиланнями (зворотний косий рядок, номер групи), які замінюються тим, що було узгоджено групами. Групи рахуються так само, як і за group(...)функцією, тобто починаючи 1зліва направо, відкриваючи дужки.


4
Шлях ясніший за док! Не зрозумів, як група працює з цим. Вони повинні додати такий приклад.
Y0da

це працювало з першого разу. Це досить хороший зрозумілий спосіб пояснити це. Дякую і чи можете ви пояснити, як підгрупа повинна викликати належну (r(r))r((r)((r)r))ситуацію?
Ракшита Муранга Родріго

1
@RakshithaMurangaRodrigo Групи пронумеровані зліва направо, там, де вони починаються. Так що, якщо я вводжу номер право кожної групи перед групою, вони будуть відсортовані: 1(r2(r))r3(4(r)5(6(r)r)).
Мартін Ендер

@MartinEnder: Велике спасибі!
Ракшита Муранга Родріго

30

Прийнята відповідь ідеальна. Я додам, що посилання на групу, мабуть, краще досягти за допомогою цього синтаксису:

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

для рядка заміни. Таким чином, ви обходите обмеження синтаксису, де за групою може бути цифра. Знову ж таки, це все присутнє в документі, нічого нового, просто іноді важко помітити на перший погляд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.