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

코딩을 하다 보면 문자열 처리를 요구할 때가 많습니다. 당연히 코드로 풀어낼 수도 있고, 자주 사용되는 코드는 함수화 시켜 사용할 수도 있지만 정규식을 사용하게 되면 훨씬 간단하게 처리할 수 있습니다. 모든 일에는 일장일단이 있듯이 정규식을 많이 사용하게 되면 정규식 작성자 외 다른 사람이 코드를 읽을 때 직관성이 떨어집니다. 특히 여러 명과 공동작업을 협업할 때에는 생산성 또는 효율성이 오히려 저하될 수 있다는 점입니다.
하지만 정규 표현식의 특성과 사용법을 잘 파악하고 적절하게 사용하게 된다면 우리가 원하는 목적에 대한 코드가 좀 더 원활하게 작성될 수 있겠죠!? (클래스를 몰라도! 정규 표현식을 몰라도! 코딩은 가능합니다.^^) 정규 표현식(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('a\nb')
>>> print(m)
<re.Match object; span=(0, 3), match='a\nb'>
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회독 했을 뿐인데 그동안 많은 변화가 있었습니다. 심지어 앞으로 제가 하는 일에 대한 방향성과 목표까지도 다시금 생각하게 되더군요. 입문서이지만 여러모로 많은 것을 가져다준 점프 투 파이썬을 당분간 옆에 두고 낡아 떨어질 때까지 읽어줘야겠습니다.