Python Regex мгновенно заменяет группы


108

Есть ли способ напрямую заменить все группы с помощью синтаксиса регулярных выражений?

Обычный способ:

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

Но я хочу добиться чего-то вроде этого:

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

Я хочу мгновенно создать новую строку из групп, только что захваченных Regex.

Ответы:


191

Взгляните на 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)).
Мартин Эндер

30

Принятый ответ идеален. Я бы добавил, что групповая ссылка, вероятно, лучше достигается с помощью этого синтаксиса:

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

для строки замены. Таким образом можно обойти ограничения синтаксиса, когда после группы может следовать цифра. Опять же, все это присутствует в документе, ничего нового, просто иногда трудно заметить с первого взгляда.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.