2013-02-12 4 views
-2

문자열이있어서 추출해야합니다. 문제는 반복 내에서 반복을 설명 할 수 없다는 것입니다. "반복 내의 Python 정규 표현식 그룹 반복

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

그래서 그룹이있다 - : 그래서 여기에 코드입니다 :

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') 

하지만이 같은 튜플을 좀하고 싶습니다 cg_mk "는 두 문자 패턴의 반복을 포함합니다. 결과의

[a-z]{2}+ 

그룹 여기에 표현 된 반복의 다시 마지막 부분주지 :하지만 그런 어떤 일이

([a-z]{2}) 

내 생각이 있어야한다이었다에게 "+" 너무 같아서 :

([a-z]{2})+ 

같은 결과가 나온다. 일치 개체가 생성되면 단순히 원하는 그룹을 얻을 수 없습니다.

+3

나는 이것이're'을 사용하는 간단한 파이썬 정규 표현식으로는 가능하지 않을까 의심 스럽다. AFAIK,'re '내의 모든 함수는 * 중첩되지 않는 * 발생을 처리합니다. 겹치는 사건을 잡는 것은 꽤 힘든 것 같습니다 ... – mgilson

+0

달성하려는 것에 대해 좀 더 설명해 주시겠습니까? 왜 출력물에 반복이 필요합니까? 이 다른 입력을 사용해야합니까? – deadly

+0

나는 modul을 가지고 무엇을 할 수 있을지 궁금하다. 위에서 설명한 결과를 한 줄로 얻을 수 있습니까? 물론 F.J가 썼던 해결책을 고려했습니다. – 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')을 캡처 한 다음 - 또는 _의 발생에 두 번째 그룹을 분할의 결과로이 결합되어 있습니다.

정확한 두 문자 패턴 수를 알고 있다면 미리보기를 사용하여이를 수행 할 수 있지만 앞에서 알 수있는 것처럼 보이지 않거나 반복 할 필요가 없습니다.