2016-01-20 3 views
2

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

Lorem ipsum AB-CD-01 dolor sit amet, AB-CD-Foobar consectetur 

Я хочу, чтобы захватить все фразы AB-CD- *. Я пытался что-то вроде этого:

pattern = re.compile("((AB-CD-\S+).*)*") 
result = pattern.search(text) 
print(result.groups()) # expected: ('AB-CD-01', 'AB-CD-Foobar') 

Я знаю, что это довольно простая и основная проблема регулярного выражения, но я не мог найти хорошее решение.

+1

Используйте 're.findall()' с regex ['(AB-CD- \ S +)'] (https://regex101.com/r/bO5gT9/2) – Tushar

+0

Спасибо! Так что это невозможно с помощью метода 'search()'? – trivelt

ответ

3

Вы можете использовать более простой шаблон с re.findall:

вернуть все непересекающихся матчи шаблона в строке, в виде списка строк. Строка отсканирована слева направо и совпадения возвращаются в указанном порядке. Если в шаблоне присутствует одна или несколько групп, верните список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого матча.

Пример код с обновленным регулярным выражением:

import re 
p = re.compile(r'AB-CD-\S+') 
test_str = "Lorem ipsum AB-CD-01 dolor sit amet, AB-CD-Foobar consectetur" 
print(re.findall(p, test_str)) 
# => ['AB-CD-01', 'AB-CD-Foobar'] 

См IDEONE и regex demo

re.search находит только первое вхождение, re.findall возвращает список совпадений (если не захватывая группы не определены шаблон - вот почему я предлагаю удалить их).

Смежные вопросы