Python 정규표현식

2020년 7월 3일 수정

아래는 Python의 정규표현식을 간략하게 정리한 글이며 상세한 것은 공식 매뉴얼을 참조하자.

정규표현식 패턴

매뉴얼을 정리하는 것은 너무 방대하고 자주 쓰일 만한 패턴 몇 가지만 정리해보자.

^
시작 지점
$
끝 지점
[abc]*
a 혹은 b, c 등의 문자로 구성된 문자열이거나 혹은 없거나
[a-zA-Z]+
영문자 1자 이상
[\d]{10}
숫자만 10자리
(message)
'message' 라는 문자열을 매치하고 이를 그룹으로 표현

\d 처럼 몇 가지 특수한 문자셋을 지정할 수 있는데 예를 들어 아래와 같은 것들이 있다.

\d
숫자(Digit). [0-9] 와 거의 동일한 표현이다.
\D
숫자가 아닌 것. [^0-9] 와 거의 동일한 표현이다.
\s
공백(Whitespace)
\S
공백이 아닌 것
\w
문자(숫자 + 영문자). [0-9a-zA-z] 와 비슷하다.
\W
영문자나 숫자가 아닌 모든 경우. [^0-9a-zA-Z] 와 비슷하다.

소문자와 대문사 사이의 캐릭터셋이 반대로 구성되어 있다는 점이 특징이라면 특징이다.

정규표현식 패턴 컴파일

정규표현식을 이용하려면 우선 패턴을 만들어야 한다. 패턴은 re 모듈의 compile 을 사용하면 만들 수 있다.

import re
p = re.compile(r'(a(bc))')

문자열 앞에 r 이 붙이었는데 이 표현은 문자열을 순수(raw) 문자열로 표현하라, 즉 문자열 내부를 이스케이프(escape)하지 말라는 의미다. 예를 들어 문자열 안에 \n 있으면 해당 위치에는 일반적으로는 개행(newline) 문자가 들어가는데 문자열 앞에 r 이 붙어있으면 \n 이 그대로 들어간다.

이제 이 컴파일 된 패턴을 이용해 패턴 매칭을 할 수 있다.

패턴 매칭

패턴 매칭을 하기 위한 몇 가지 메서드가 있다.

match()

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

match 는 해당 문자열의 처음부터 비교를 수행한다. 처음부터 비교를 수행한다는 점을 주의하자.

search()

>>> p.search('aaabcccc')
<re.Match object; span=(2, 5), match='abc'>

search 는 문자열 내부에서 매칭을 시도한다.

findall()

>>> p.findall('aaabcccc')
[('abc', 'bc')]

findall 은 모든 그룹에 대한 매칭 결과를 돌려준다.

fullmatch()

>>> p.fullmatch('aaabcccc')
>>> p.fullmatch('abcc')
>>> p.fullmatch('abc')
<re.Match object; span=(0, 3), match='abc'>

fullmatch 는 완벽하게 일치하는 패턴을 검사한다. 마치 패턴 시작에 ^ 를 넣고 패턴 끝에 $ 를 넣은 것과 동일하다.

Match 오브젝트

match()search() 의 결과로 받은 re.Match 오브젝트는 별도의 추가 정보를 담고 있다.

>>> m = p.search('aaabcccc')
>>> m
<re.Match object; span=(2, 5), match='abc'>
>>> m.groups()
('abc', 'bc')
>>> m.group()
'abc'
>>> m.start()
2
>>> m.end()
5
>>> m.span()
(2, 5)
groups()
경우 세부 그룹이 있을 때 각 그룹에 매칭된 결과를 모두 담아준다.
group()
매칭된 문자열 자체를 돌려준다.
start()
원래 문자열에서 매칭된 문자열의 시작 위치(index)를 돌려준다.
end()
원래 문자열에서 매칭된 문자열의 끝 위치(index)를 돌려준다.
span()
start()end() 가 하나로 합쳐진 형태의 튜플을 돌려준다.