정규 표현식의 single line모드 질문입니다.
글쓴이: chronon / 작성시간: 수, 2005/06/22 - 9:19오전
찾으려는 패턴 중간에 \n 이 (지 맘대로 :evil: ) 끼어 있습니다.
대충 이런 형태인데요.
____<tag>content1 </tag> ____ <tag> content2 </tag>_________
여기서 <tag></tag> 안에 있는 내용을 추출해 내고 싶습니다.
정규표현식의 dot이 \n을 처리하지 않기 때문에 옵션을 줘서 single line 모드를 사용하라고 되어 있어서 다음과 갈이 했습니다.(파이썬)
result = re.findall('<tag>(.*)</tag>', r, re.S)
그런데, 원래 기대하기로는 result = ['content1\n' , '\ncontent2\n']과 같은 식이 될 것이라고 생각했는데,
result = ['content1\n</tag> ____\n<tag>\ncontent2\n']과 같이 들어가 버립니다.
어떻게 하면 원래 기대하던 것처럼 <tag></tag> 내의 값을 추출해 낼 수 있을까요?
Forums:
Re: 정규 표현식의 single line모드 질문입니다.
이걸
result = re.findall('<tag>(.*?)</tag>', r, re.S)
라고 고쳐 보세요. 대부분의 정규표현식 표현에서는 Greedy, 즉 가능한 많은 텍스트를 .*에 매치시키려고 하기 때문에 마지막 </tag>까지 매치됩니다. 이를 방지하기 위해서는 .*?, .+?와 같이 ?를 붙여 줘서 Greedy하게 매칭하지 말라는 표시를 해 줘야 합니다.
- 토끼군
덤: PHP(정확히는 PCRE)의 경우 기본으로 .* 등등이 Greedy하게 동작하지 않게 하는 U(Ungreedy) 옵션이 있습니다. 파이썬에는 없죠.
댓글 달기