Python 정규표현식
2020년 7월 3일 수정
≡ 목차 (Table of Contents)
아래는 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()
가 하나로 합쳐진 형태의 튜플을 돌려준다.