2013-02-12 2 views
-2

У меня есть строка и ее нужно извлечь. Проблема в том, что я не могу описать повторение в повторении. Так вот код:Повторение группы регулярных выражений Python в повторении

f = "Makimak-cg_mk_Mokarmi" 
pattern = "([A-Za-z][A-Za-z0-9]+)((?:[-_]([a-z]{2}))+)" 
mO = re.match(pattern, f) 
print mO.groups() 

И результат будет:

('Makimak', '-cg_mk', 'mk') 

Но я хотел бы получить кортеж так:

('Makimak', '-cg_mk', 'cg', 'mk') 

Так есть группа «- cg_mk ", которые включают повторение двух шаблонов символов. Но нет вещи, как, что:

[a-z]{2}+ 

Группы результата не дают обратно только последнюю часть повторении выражается здесь:

([a-z]{2}) 

Моя мысль была, что там должна быть «+» тоже вот так:

([a-z]{2})+ 

Это дает тот же результат. Объект match создается, просто я не могу получить группы, которые я хочу.

+3

Я сомневаюсь, что это возможно с помощью простого python regex с использованием 're'. AFAIK, все функции в 're' имеют дело с * неперекрывающимися * встречами. Улавливание перекрывающихся событий кажется довольно сложным ... – mgilson

+0

Можете ли вы объяснить немного больше о том, чего вы пытаетесь достичь? Зачем вам нужны повторы в выходе? С какими другими факторами следует работать? – deadly

+0

Мне просто интересно, что я могу сделать с модулем. Можно ли получить результат, описанный выше в одной строке. Конечно, я рассматривал решение, как писал Ф. Дж. – Prag

ответ

0

Вам может понадобиться сделать это в два этапа:

>>> f = "Makimak-cg_mk_Mokarmi" 
>>> pattern = "([A-Za-z][A-Za-z0-9]+)((?:[-_][a-z]{2})+)" 
>>> mO = re.match(pattern, f) 
>>> print mO.groups() + tuple(re.split('[-_]', mO.group(2))[1:]) 
('Makimak', '-cg_mk', 'cg', 'mk') 

Это просто захватывает группы ('Makimak', '-cg_mk'), а затем объединяет их в результате расщепления второй группы по вхождений - или _.

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

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