본문 바로가기
코딩 이야기/파이썬(Python)

단도직입 파이썬(Python) – 정규식(Regular Expression) 2/2

by 아재코더 2021. 12. 17.
정규표현식

코딩을 하다 보면 문자열 처리를 요구할 때가 많습니다. 당연히 코드로 풀어낼 수도 있고, 자주 사용되는 코드는 함수화 시켜 사용할 수도 있지만 정규식을 사용하게 되면 훨씬 간단하게 처리할 수 있습니다. 모든 일에는 일장일단이 있듯이 정규식을 많이 사용하게 되면 정규식 작성자 외 다른 사람이 코드를 읽을 때 직관성이 떨어집니다. 특히 여러 명과 공동작업을 협업할 때에는 생산성 또는 효율성이 오히려 저하될 수 있다는 점입니다.

하지만 정규 표현식의 특성과 사용법을 잘 파악하고 적절하게 사용하게 된다면 우리가 원하는 목적에 대한 코드가 좀 더 원활하게 작성될 수 있겠죠!? (클래스를 몰라도! 정규 표현식을 몰라도! 코딩은 가능합니다.^^) 정규 표현식(Regular Expression)을 사용하려면 항상 re.compile을 통해 컴파일 과정을 거치게 되는데 이때 사용할 수 있는 옵션에 대해 알아봅니다.

 
옵션
약어
설명
DOTALL
S
dot( . )가 줄바꿈 문자를 포함하여 모든 문자와 매치
IGNORECASE
I
대소문자에 관계없이 매치
MULTILINE
M
여러 줄과 매치(^, $ 메타 문자와 관계가 있는 옵션)
VERBOSE
X
verbose 모드를 사용(주석 사용)

 

DOTALL, S

dot( . ) 메타 문자는 줄바꿈 문자(\n)를 제외한 모든 문자와 매치되지만 re.DOTALL 또는 re.S 옵션을 사용하면 줄바꿈 문자도 컴파일 가능합니다.

>>> import re

>>> p=re.compile('a.b', re.DOTALL)

>>> m=p.match('anb')

>>> print(m)

<re.Match object; span=(0, 3), match='anb'>

 

IGNORECASE, I

re. IGNORECASE 또는 re.I는 대소문자 구별 없이 매치를 수행합니다.

 

MULTILINE, M

re. MULTILINE 또는 re.M은 ^, $메타 문자와 결합하여 여러 줄의 문자열과 매치를 수행합니다.

 
결괏값의 차이가 있음을 확인할 수 있습니다.

 

VERBOSE, X

정규식을 줄 단위로 구분하고, 주석을 사용할 수 있게 합니다.

 

a = re.compile(r’&[#](0-7)+|[0-9]+|x[0-9a-fA-F]+);’)

복잡한 정규식의 예를 보면 뭔 소린가 싶네요.

 

a = re.compile(r’’’

&[#] #start of a numeric entity reference

(

0[0-7]+ #octal form

| [0-9]+ #decimal form

| x[0-9a-fA-F]+ #heximal form

)

; #trailing semicolon

‘’’, re.VERBOSE)

re.VERBOSE를 사용하면 space가 제거됩니다.(단, [ ] space는 제외)

 

백슬래시 문제

예를 들어 ‘\section’ 문자열을 찾기 위해 정규식을 만든다고 가정해 봅니다. \section의 정규식에서 \s는 space로 인식되어 원하는 결과를 얻을 수 없습니다. p=re.compile(‘\\section’)과 같이 ‘\\’ 백슬래시 두 개를 이용하여 컴파일 하면 됩니다. 하지만 파이썬에서는 리터럴 규칙에 따라 \\는 \로 변경됩니다. (파이썬 사용 시에만 발생하는 점 유의하세요!) 파이썬에서는 \\를 전달하기 위해 \\\\ 백슬래시를 4개 사용해야 합니다.

p = re.compile(‘\\\\section’) 또는 p = re.compile(r‘\\section’)은 같은 효과를 나타냅니다. r 문자를 삽입하면 이 정규식은 Raw String 규칙에 의하여 백슬래시 2개만 대신 1개만 써도 2개를 쓴 것과 같은 의미를 갖게 됩니다. 지금까지 알아본 메타 문자 외 자주 사용되는 메타 문자에 대해 알아봅니다.

메타 문자
설명
|
or과 동일한 의미
^
문자열의 맨 처음과 매치(멀티라인 일 때 각 라인마다 적용)
$
문자열의 맨 끝과 매치(멀티라인 일 때 각 라인마다 적용)
\A
^와 동일하지만 멀티라인에서도 문자열의 맨 처음과 매치
\Z
$와 동일하지만 멀티라인에서도 문자열의 맨 끝과 매치
\b
단어 구분자
예를 들어 '\bA\b'는 A의 앞뒤가 space 일 때만 매치
\B
단어 구분자 \b의 반대 개념으로 앞뒤 space가 아닐 때 매치

 

지금까지 파이썬 관련 문법과 자료형, 조건문, 반복문, 함수, 클래스 등 기초적인 내용들은 어지간히 살펴본 것 같습니다. 이제 겨우 입문서 1회독 했을 뿐인데 그동안 많은 변화가 있었습니다. 심지어 앞으로 제가 하는 일에 대한 방향성과 목표까지도 다시금 생각하게 되더군요. 입문서이지만 여러모로 많은 것을 가져다준 점프 투 파이썬을 당분간 옆에 두고 낡아 떨어질 때까지 읽어줘야겠습니다.

댓글