Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 여러 줄 패턴 매칭하기 – re.DOTALL 플래그 활용법

Python에서 여러 줄에 걸친 패턴 매칭 방법

정규 표현식에서 마침표(.) 특수 문자는 기본적으로 줄바꿈 문자(\n)를 제외한 모든 문자와 일치합니다. 따라서 여러 줄로 구성된 텍스트를 하나의 패턴으로 매칭하려면 추가 설정이 필요합니다.

이때 사용하는 것이 바로 re.DOTALL 플래그입니다. 이 플래그를 지정하면 마침표(.)가 줄바꿈 문자를 포함한 모든 문자와 일치하도록 동작이 변경됩니다.

기본 사용 예제

import re

paragraph = '''
<p>
   This is a paragraph.
   It has multiple lines.
</p>
'''

match = re.search(r'<p>.*</p>', paragraph, re.DOTALL)
print(match.group(0))

실행 결과:

<p>
   This is a paragraph.
   It has multiple lines.
</p>

위 예제에서 .*는 줄바꿈을 포함한 모든 문자를 소비하기 때문에, 여러 줄에 걸쳐 있는 <p>...</p> 블록 전체가 하나의 매칭 결과로 반환됩니다.

re.DOTALL 없이 실행하면 어떻게 될까?

플래그 없이 동일한 코드를 실행하면 .가 첫 번째 줄바꿈을 넘지 못해 패턴 매칭에 실패하고, matchNone이 됩니다. 이후 match.group(0)을 호출하면 AttributeError가 발생하므로 주의해야 합니다.

인라인 플래그로 간단하게 쓰기

함수 인자 대신 패턴 문자열 안에 (?s) 인라인 플래그를 넣어도 같은 효과를 얻을 수 있습니다.

match = re.search(r'(?s)<p>.*</p>', paragraph)

추가 팁: 탐욕적 매칭 주의하기

.*는 탐욕적(greedy)으로 동작하여 가능한 한 가장 긴 범위를 매칭합니다. 문서에 <p> 블록이 여러 개 있을 경우 의도하지 않은 결과가 나올 수 있으므로, 최소 매칭을 원한다면 .*?(비탐욕적)를 사용하는 것이 좋습니다.