2011-10-23 2 views
1

정규식을 배우고 있으며 파이썬이 사용하는 메커니즘을 확인하고 싶습니다.파이썬 2.6 정규식 메커니즘?

s = re.findall(ur"\d+\.?\d+", "123,45.567 78"). 

먼저 나는 결과가 될 것에만 45.567

내가 그것을 실행하면, 내가받은 소수를 포함하여 모든 숫자 ([ "123"이라고 생각 :

나는 정규식이 , "45.567", "78"]) 그러나 사용 된 프로세스는 명확하지 않습니다.

여기 내 이해가 있습니다 : 파이썬은 먼저 \ d +로 시작하여 123 인 것을 찾습니다 (쉼표 앞에 가능한 한 탐욕적인 검색). 다음으로는 거기에없는 선택적인 점 (.?)을 기대하며 괜찮습니다. 다음으로 하나 이상의 자릿수가 필요합니다. 그러나 다음 문자는 허용되지 않는 쉼표 (,)입니다. 파이썬은 12로 돌아갑니다 (드롭 3). 12 fullfils 첫 번째 \ d +. 다음에는 거기에없는 선택적인 도트가 예상되며 그 다음에 하나 이상의 숫자가 필요하고 3이 그와 일치합니다. 즉, 123 fullfils 전체 정규식입니다.

파이썬은 123에 대해 오프셋 2를 기억하고 123 이후에 다시 시작합니다. 즉, 파이썬은 문자열 45.567,78에서 전체 정규식을 사용하기 시작합니다.

즉, 전체 정규식은 세 번 사용됩니다. 처음은 123 는 45.567 발견하고 .는 선택 사항이기 때문에 세 번째는 (이것은 모든 일치하는 이유는 어쩌면 지금 참조) 78

+1

질문의 형식에 더주의하십시오. 큰 텍스트 블록은 읽기가 어렵습니다. 코드 형식을 사용하십시오. – Mat

+0

's = re.findall (ur "\ d + \? \ d +", "123,45,567 78", re.DEBUG)'을 실행하면 파이썬의 행동을 따라 가야합니다. – robert

+0

첫 번째'123'이 어떻게 일치하는지에 대한 설명이 정확합니다. 이것이 일치하면 regex 엔진은 첫 번째 일치 (쉼표 바로 앞의 위치) 바로 다음 위치에서 일치를 시도하지만 실패합니다. 그러나 엔진은 포기하지 않고 문자열의 다음 문자로 "춤추 기"_ 때문에 "45.567"과 일치 할 수 있습니다. 그런 다음 실패 직전에 다시 실패하고 부딪 히며 세 번째 경기를 찾습니다. 정규식 엔진은 문자열 내의 마지막 위치 다음의 위치에서도 문자열 내의 모든 위치에서 일치하는 항목을 확인하면서 충돌합니다. – ridgerunner

답변

4

\d+\.?\d+ 항상 또한 \d+\d+ 일치합니다 발견 할 것이다 두 번째 시간을 찾습니다. 따라서 제약 조건이 허용하는만큼 되돌릴 수 있습니다. documentation of findall (강조 광산)에서

1

:

반환 모든 문자열 목록으로 문자열에서 패턴의 일치를, 비 중첩.

나는 이것이 당신이보고있는 행동을 묘사하는 것처럼 보입니다. 겹치지 않는 성냥을 얻으려면 이전 성냥의 끝 후에 다음 성냥을 시작해야합니다.