Несколько групп захвата в группе без захвата с использованием Python регулярных выражений - PullRequest
0 голосов
/ 21 июня 2020

У меня есть следующий код, использующий несколько групп захвата внутри группы без захвата:

>>> regex = r'(?:a ([ac]+)|b ([bd]+))'
>>> re.match(regex, 'a caca').groups()
('caca', None)
>>> re.match(regex, 'b bdbd').groups()
(None, 'bdbd')

Как я могу изменить код, чтобы он выводил либо ('caca'), либо ('bdbd')?

Ответы [ 4 ]

2 голосов
/ 21 июня 2020

Другой вариант - получить совпадения с помощью просмотра назад без группы захвата:

(?<=a )[ac]+|(?<=b )[bd]+

Regex demo

Например

import re

pattern = r'(?<=a )[ac]+|(?<=b )[bd]+'
print (re.search(pattern, 'a caca').group())
print (re.search(pattern, 'b bdbd').group())

Выход

caca
bdbd
2 голосов
/ 21 июня 2020

Вы близки.

Чтобы всегда получать захват, группа 1 может использовать предварительный просмотр для сопоставления, а затем отдельную группу захвата для захвата:

(?:a (?=[ac]+)|b (?=[bd]+))(.*)

Демо

Или в Python3:

>>> regex=r'(?:a (?=[ac]+)|b (?=[bd]+))(.*)'
>>> (?:a (?=[ac]+)|b (?=[bd]+))(.*)
>>> re.match(regex, 'a caca').groups()
('caca',)
>>> re.match(regex, 'b bdbd').groups()
('bdbd',)
1 голос
/ 21 июня 2020

Вы можете использовать группу сброса ветвления с PyPi regex модулем :

Альтернативы внутри группы сброса ветви используют одни и те же группы захвата. Синтаксис: (?|regex), где (?| открывает группу, а регулярное выражение - любое регулярное выражение. Если вы не используете какие-либо группы чередования или захвата внутри группы сброса ветвления, то ее специальная функция не играет роли. Затем он действует как группа без захвата .

Регулярное выражение будет выглядеть как

(?|a ([ac]+)|b ([bd]+))

См. Демонстрацию regex . См. Демонстрацию Python 3 :

import regex
rx = r'(?|a ([ac]+)|b ([bd]+))'
print (regex.search(rx, 'a caca').groups()) # => ('caca',)
print (regex.search(rx, 'b bdbd').groups()) # => ('bdbd',)
0 голосов
/ 21 июня 2020

Посмотрите на проблему с другой стороны:

((?:a [ac]+)|(?:b [bd]+))
^ ^         ^ ^
| |         | other exact match
| |         OR
| not capturing for exact match
capture everything

Более простой вид: https://regex101.com/r/e3bK2B/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...