2013-12-18 2 views
0

I (또는 '서브 패턴')과 같이 정규식 교대에서 다른 문자열 또는 패턴의 문자열이있는 경우 :파이썬 re.findall()

r'abcd|bc' 

가의 예상되는 동작 무엇입니까 re.compile(r'abcd|bc').findall('abcd bcd bc ab')?

(예상대로), 내가

['abcd', 'bc', 'bc'] 

그래서 난 ['bc', 'bc', 'bc']를 얻을 수 re.compile(r'bc|abcd').findall('abcd bcd bc ab') 생각 얻을 그것을 밖으로 시도하지만 대신 다시 반환

['abcd', 'bc', 'bc'] 

누군가가이 설명 할 수 있습니까? 나는 findall이 탐욕 스럽지만 분명히 되돌아 오는 인상을 받고 있었지만, 더 길어진 토큰을 얻을 수있는 대체 패턴을 찾아서 되돌려 보려합니다.

답변

3

역 추적이 수행되지 않습니다. 전혀입니다. 패턴은 두 가지 유형의 문자열과 일치합니다. |또는을 의미합니다. 각 패턴은 각 위치에서 시도됩니다. 표현이 입력의 시작 abcd을 발견하면

그래서, 그 텍스트는 당신이 그것을 준 ( bc 또는 abcd) 패턴의 abcd 부분에 맞는, 당신의 패턴이 잘 일치합니다. 대체 부품의

주문은 지금까지 정규 표현식 엔진에 관한 한, abcd|bcbc|abcd같은 일이며, 여기에 재생되지 않습니다. abcd은 나중에 bc이 문자열에서 나중에 일치 할 수 있으므로 무시되지 않습니다.

+0

나는 본다. 고맙습니다 – tiao