2011-01-24 13 views
1

다음 정규식이 작동하지 않는 이유를 알아 내는데 어려움이 있습니다.Beginning (python) regex question

나는이 작업을 수행하기 위해 다른 정규 표현식을 만들 수 있음을 알고 있지만이 것이 작동해야한다고 생각했습니다.

re.search ("(\d*)", "prefix 1234 suffix").groups() 
('',) 

흥미롭게도, findall은이 작동하는 것 같다 : 이해

re.findall("(\d*)", "prefix 1234 suffix") 
['', '', '', '', '', '', '', '1234', '', '', '', '', '', '', '', ''] 

을 그 작동 왜,하지만 난 검색이 작동하지 않는 이유에 여전히 혼란 스러워요? 당신이 지시하는 *+ A를 변경하여

re.findall("(\d+)", "prefix 1234 suffix") 

: 나의 이해는 일치하는이 시도 전체 문자열을 일치하도록 강제하지만, 문자열

답변

6

.search은 검색을 한 번 실행하기 때문에 처음부터 일치 할 수 있습니다. \d*은 문자가 전혀 일치 할 수 없으므로 일치 할 수있는 첫 번째 문자는 문자의 시작 부분에 있으므로 아무 문자도 캡처하지 않으므로 첫 번째 캡처 그룹은 ''입니다. 그것은 당신이 요구 한대로 정확하게하고 있습니다. 당신은 적어도 하나의 에게 자리와 일치하는 대신 정규식 (\d+)을 만들었다 경우

, 다음 일치 수있는 최초의 장소는 1에있을 것이다 그것은 1234을 캡처하는 것입니다.

1

아무 곳 숫자를 찾아야한다 를 검색해야 할 것입니다 패턴 \d은 1 번 이상 일치해야합니다. 처음에 사용했던 *은 문자열의 각 문자와 일치하는 0 번 이상 일치했습니다.

+0

혼란을 명확히하기 위해 제 질문에 조금 더했습니다. findall이 작동한다는 것을 알았지 만 검색이 작동하지 않는 이유가 궁금했습니다. – Hortitude

3

작동합니다. 첫 번째 예제의 반환 값은 반환 값의 첫 번째 요소 인 findall에 해당합니다. 그냥 정규식으로 r'(\d+)'을 사용하십시오.

search은 문자열 내의 모든 숫자를 찾지 않습니다. 숫자를 0 번 이상 찾도록 지시하는 정규식 일뿐입니다. 따라서 모든 문자 테두리에서 0 자리 숫자를 찾습니다.

3

\d*이 아니라 \d+을 사용하십시오. \d*은 0 이상을 의미하며, 은 0이이고 문자열의 오프셋 0에서 얻는 값입니다.