2012-07-11 2 views
42
>>> match = re.findall(r'\w\w', 'hello') 
>>> print match 
['he', 'll'] 

\ w \ w는 2자를 의미하기 때문에 'he'와 'll'이 필요합니다. 하지만 '엘'과 '로우'는 왜 이 아니며은 정규식과 일치합니까?regexp와 겹치는 일치를 찾는 방법은 무엇입니까?

>>> match1 = re.findall(r'el', 'hello') 
>>> print match1 
['el'] 
>>> 
+2

[룩어 헤드 (http://stackoverflow.com/questions/320448/overlapping-matches-in-regex) –

답변

70

findall 기본적으로 일치하는 항목이 중복되지 않습니다.

(?=...) 일치 다음 ... 일치하는 경우는 있지만, 문자열 중 하나를 소비하지 않습니다

여기 (?=...)
>>> re.findall(r'(?=(\w\w))', 'hello') 
['he', 'el', 'll', 'lo'] 

lookahead assertion이다 :이 표현은 그러나 않습니다. 이를 미리보기 주장이라고합니다. 예를 들어, Isaac (?=Asimov)'Asimov' 다음에 오는 경우에만 'Isaac '과 일치합니다.

7

길이가 0 인 어설 션을 제외하고 입력의 문자는 항상 일치하는 데 소비됩니다. 입력 문자열의 특정 문자를 한 번 더 캡처하려는 경우에는 정규식에서 길이가 0 인 어설 션이 필요합니다.

여러 길이 제로의 주장이있다 (예를 들어 ^ (입력/라인), 입력/라인의 $ (끝) \b (워드 경계)의 시작) (?<=) 긍정적 인 모습 숨김 및 (?=) 만 볼 어라운드 (긍정적 인 미리보기)는 입력에서 겹쳐지는 텍스트를 캡처 할 수있는 유일한 방법입니다. 부정적인 look-arounds ((?<!) negative look-behind, (?!) negative look-ahead)는 여기서는별로 유용하지 않습니다 : 그들이 진실이라고 주장하면 내부 캡처가 실패합니다; 그들이 거짓을 선언하면 일치는 실패합니다. 이러한 어설 션은 앞에서 언급 한 길이가 0이며, 이는 입력 문자열의 문자를 소비하지 않고도 어설 션한다는 것을 의미합니다. 어설 션이 성공하면 빈 문자열과 실제로 일치합니다. 위의 지식을 적용

될 것입니다 귀하의 경우에 작동하는 정규식 :

(?=(\w\w)) 
20

당신은 일치 중복 것을 지원 new Python regex module를 사용할 수 있습니다.

>>> import regex as re 
>>> match = re.findall(r'\w\w', 'hello', overlapped=True) 
>>> print match 
['he', 'el', 'll', 'lo'] 
관련 문제