2017-03-07 3 views
0

는 :파이썬 정규 표현식의 불일치가 있습니까? 나는 다음과 같은 코드를 실행하면

수입

s = 'baaaad' 

l = re.findall(r'((a)(?=a))', s) 
print l 
for elem in l: 
    print ''.join(elem) 

재 I 출력 얻을 :

[('A', 'A'), ('A', '을은'), ('a', 'a')] aa aa aa

이는 예상대로입니다. 내가 lookbehind 예에 대한 대응 전략을 시도 할 때 :

s = 'baaaad' 

l = re.findall(r'((?<=b)(a))', s) 
    print l 
for elem in l: 
    print ''.join(elem) 

를 내가 얻을 :

: 나는 얻기 위해 기다리고 있었다

[('A', 'A')] AA

[('B', 'A')] 바 왜이 (나에게)

예기치 않은 동작? 내가 뭔가 잘못하고 있다면, 그게 뭐지? 그리고 그것을 고치는 방법?

감사합니다!

답변

3

출력의 그룹 중 하나가 (a)이고 다른 하나가 미리보기 또는 lookbehind라고 생각하는 것 같습니다. 그건 사실이 아니야. 그룹 중 하나는 (a)이고, 다른 하나는 전체 정규식을 둘러싼 괄호에서입니다 :

v v not these 
((?<=b)(a)) 
^  ^these 

룩어 하지 경기 a을 수행하고 lookbehind 하지 경기 b 않습니다. 문자열 과 일치하고 a이 발생하거나 그 전에 b이 발생합니다. 실제 문자와 일치하지 않습니다. 따라서 정규 표현식은 모두 a과 일치하며 전후에 어떤 것에 대한 제한이 있으며 두 정규 표현식의 캡처 링 그룹 모두는 a 만 캡처합니다.

+0

'((? <= (b)) (a))' – revo

+0

알려주세요. 그래서 당신은 그 선견자에 대한 "올바른"대답조차도 다른 이유가 있다고 말하고 있습니까? – whirlaway

+0

@whirlaway : 예. 눈에 보이는 결과가 정확히 정반대 인 버그가 두 개 있었으므로 원하는 출력을 생성했습니다. 당신이 일을 조금 바꿨을 때, 버그의 효과는 반대였습니다. – user2357112

관련 문제