Как захватить повторное вхождение с помощью регулярного выражения Python 3 - PullRequest
2 голосов
/ 31 марта 2019

Рассмотрим предложение: W U T Образец A B C D

Я пытаюсь использовать re.groups после re.search для извлечения A, B, C, D (буквы в заглавных буквах после 'Sample'). Может быть переменное количество букв

Несколько неудачных попыток:

A = re.search('Sample\s([A-Z])\s*([A-Z])*', 'W U T Sample A B C D')
A.groups()
('A', 'B')

A = re.search('Sample\s([A-Z])(\s*([A-Z]))*', 'W U T Sample A B C D')
A.groups()
('A', ' D', 'D')

A = re.search('Sample\s([A-Z])(?:\s*([A-Z]))*', 'W U T Sample A B C D')
A.groups()
('A', 'D')

Я ожидаю A.groups(), чтобы дать ('A', 'B', 'C', 'D')

Взяв другой пример, 'XSS 55 D W Образец R G Y BH' должен дать результат ('R', 'G', 'Y', 'B', 'H')

1 Ответ

1 голос
/ 31 марта 2019

Большинство движков регулярных выражений, включая Python, перезаписывают повторяющуюся группу захвата.Таким образом, повторяющаяся группа захвата, которую вы видите, будет только последней, и ваш текущий подход не будет работать.В качестве обходного пути мы можем сначала попытаться выделить нужную подстроку, а затем применить re.findall:

input = "W U T Sample A B C D"
text = re.search(r'Sample\s([A-Z](?:\s*[A-Z])*)', input).group(1)  # A B C D
result = re.findall(r'[A-Z]', text)
print(result)

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