Регулярное выражение Python: повторяющиеся имена в именованных группах
Есть ли способ использовать одно и то же имя в регулярном выражении именованной группы в Python? например(?P<n>foo)|(?P<n>bar)
,
Случай использования: я пытаюсь захватить type
а также id
с этим регулярным выражением:/(?=videos)((?P<type>videos)/(?P<id>\d+))|(?P<type>\w+)/?(?P<v>v)?/?(?P<id>\d+)?
из этой строки:
- / Канал / об / 123
- / Ч / об /41500082
- / канал
- / видео /41500082
Сейчас я получаю ошибку: redefinition of group name 'id' as group 6; was group 3
2 ответа
Ответ: Python re
не поддерживает группы с одинаковыми именами.
Python PyPi regex
Модуль поддерживает функцию сброса ветви:
Сброс ветки
(?|...|...)
Номера групп захвата будут повторно использованы в альтернативах, но группы с разными именами будут иметь разные номера групп.
Примеры:
>>> regex.match(r"(?|(first)|(second))", "first").groups()
('first',)
>>> regex.match(r"(?|(first)|(second))", "second").groups()
('second',)
Обратите внимание, что существует только одна группа.
А вот и живая демоверсия Python 2.7:
import regex
s = "foo bar"
rx = regex.compile(r"(?P<n>foo)|(?P<n>bar)")
print([x.group("n") for x in rx.finditer(s)])
// => ['foo', 'bar']
Вы могли бы легко превратить
match(r'(?P<n>foo)|(?P<n>bar)', s)
в
match(r'(?P<n>foo)', s) or match(r'(?P<n>bar)', s)