간만에 정규식에 대해서 정리할 일이 생겨서 블로그에도 정리해 봅니다. :)
정규식에는 greedy한 방식과 lazy(non-greedy)한 방식이 있습니다.
네, 이번에는 <>로 둘러싼 짧은 문자열을 선택했으니, 모든 태그들을 선택하게 되었습니다.
원문 : http://groups.google.com/group/python3/browse_thread/thread/c6c40a3738818d77
정규식에는 greedy한 방식과 lazy(non-greedy)한 방식이 있습니다.
일예로 ".*"의
경우가 greedy한 방식입니다. 즉, 조건을 만족하는 한 가장 긴 문자열을 선택하려고 합니다.
그리고 반대의 경우,
".*?"의 경우가 lazy한 방식입니다. 조건을 만족하는 한 가장 짧은 문자열을 선택하려고 합니다.
음,
저도 써 놓고 보니 무슨 소리인지 모르겠네요 :)
예제를 살짝 바꿔서 돌려보면 차이를 이해하실 수 있을
것입니다.
아래와 같이 "<"과 ">"로 둘러싼 문자열을 greedy하게 선택해 보겠습니다. (@python 2.6)
>>>
import urllib
>>> html = urllib.urlopen('http://www.python.org').read()
>>> import re
>>> greedy = re.compile(r'<.*>', re.I|re.S)
>>> len( greedy.findall(html) )
1
>>> html = urllib.urlopen('http://www.python.org').read()
>>> import re
>>> greedy = re.compile(r'<.*>', re.I|re.S)
>>> len( greedy.findall(html) )
1
엇, 결과 개수가 1개네요. 즉,
<>로 둘러싼 가장 긴 문자열을 선택하려고 했으니 html 태그 전체를 선택하게 된 것을 보
실 수 있습니다.
이번에는 살짝 바꿔서 lazy하게 선택해 보겠습니다.
>>> lazy =
re.compile(r'<.*?>', re.I|re.S)
>>> len ( lazy.findall(html) )
469 >>> len ( lazy.findall(html) )
네, 이번에는 <>로 둘러싼 짧은 문자열을 선택했으니, 모든 태그들을 선택하게 되었습니다.
원문 : http://groups.google.com/group/python3/browse_thread/thread/c6c40a3738818d77