Regular Expression
파이썬은 1.5버전부터 re 모듈을 통해 정규 표현식을 지원한다.
파이썬에 지원하는 정규 표현식은 펄을 대상으로 삼지만, 다음 사항들은 조심해야 한다.
# 조건 달기는 지원하지 않는다.
# \E, \1, \L, \u, \U 를 통한 대소문자 변환은 지원하지 않는다.
# \z 는 지원하지 않는다.
파이썬은 보통 re 모듈에서 정규 표현식을 컴파일 하면 RegexObject 객체를 반환한다.
이 객체의 match() 메소드나 search() 메소드에 찾고자 하는 문자열을 넘겨주면 다시 MatchObject 객체를 반환하는데, 이 객체에 일치한 텍스트 정보가 포함되어 있다.
RegexObject 객체와 MatchObject 객체에는 다음과 같은 메서드들이 있다.
* match() - 문자열의 시작 부분에서 정규 표현식과 일치하는지 검사한다.
* search() - 문자열의 전체를 훑어서 정규 표현식과 일치하는 부분이 있는지 검사한다.
* findall() - 정규 표현식과 일치한 텍스트를 모두 찾아 리스트 형태로 반환한다.
* finditer() - 정규 표현식과 일치한 텍스트를 모두 찾아 열거자 형태로 반환한다.
* group() - 정규 표현식과 일치한 텍스트를 반환한다.
* start() - 정규 표현식과 일치한 텍스트의 시작 위치를 반환한다.
* end() - 정규 표현식과 일치한 텍스트의 마지막 위치를 반환한다.
* span() - 정규 표현식과 일치한 텍스트의 시작 위치와 마지막 위치를 튜플(tuple) 형태로 반환한다.
※ match() 메소드는 시작 부분부터 찾으므로, 일치에 성공했을 때 시작 위치는 항상 0인 반면, search() 메소드는 문자열 전체를 훑으며 찾기 때문에, 시작 위치가 일정하지 않다는 점을 기억해야 한다.
TIP
정규 표현식을 컴파일하지 않고 re 모듈의 메소드에 직접 정규 표현식을 전달해 원하는 결과를 얻을 수 있다. 이는 match(), search(), findall(), finditer() 메소드에 모두 적용할 수 있다.
정규 표현식에서 역슬래시(\)를 일치시키려면 문자 그대로 일치하도록 역슬래시 문자를 이스케이프 해야 한다. 하지만 파이썬에서도 역슬래시가 특별한 의미를 지니고 있기 때문에, 정규 표현식에 역슬래시를 문자 그대로 전달하려면 역슬래시를 이스케이프 하고 이 두 역슬래시에 각각 다시 한번 역슬래시를 추카해야 한다.
즉, 역실래시 문자를 일치시키기 위해서는 정규 표현식 문자열을 \\\\로 표현해야 한다.
이 문제를 해결하려면 파이썬에서 제공하는 raw 문자열을 사용하면 된다. 문자열 앞에 알파벳 r을 붙이는 형식으로 위와 같은 상황에서 정규 표현식 문자열을 r'\\' 와 같이 표현한다.
위치 지정
패턴의 수를 지정하는 것뿐만 아니라 입력된 텍스트에서 패턴이 어느 곳에 위치하는지 지정해줄 수도 있다.
정규 표현식 앵커 부호
부 호 |
의 미 |
^ |
문자열이나 줄의 시작 |
$ |
문자열이나 줄의 끝 |
\A |
문자열의 시작 |
\Z |
문자열의 끝 |
\b |
단어의 시작이나 끝에 있는 공백 문자열 |
\B |
단어의 시작이나 끝에 있지 않은 공백 문자열열 |
결과 값
예제에서 문자열의 시작부분에 위치한 단어를 찾는 방법과 문자열이 끝나는 부분에 위치한 단어를 찾는 방법이 다르다. 그 이유는 문자열의 마지막에 있는 punctuation 이란 단어의 뒤에 마침표가 붙어있기 때문이다. 단순히 \w+$ 패턴을 사용하면 이 단어를 찾아 낼 수 없다. 마침표는 \w 가 의미하는 '숫자나 문자' 범주에 포함되지 않기 때문이다.
패턴에 플래그 넣기
패턴을 라이브러리 함수에 인자로 넘긴다거나 할 때는 표현식에 플래그를 더할 수 없다. 이런 경우에는 표현식 자체에 플래그를 끼워 넣는 방식을 사용한다.
예를 들어 대소문자를 구별하지 않는 플래그를 켜기 위해선 표현식 앞에 (?i) 를 더한다.
전체 표현식이 평가되거나 파싱되는 방식을 옵션이 조절하기 때문에 이 옵션은 표현식 앞에 와야 한다.
플래그는 같은 그룹에 조합해서 사용할 수 있다. 예를 들어 (?imu) 는 다중 라인, 유니코드, 대소문자 무시 플래그를 동시에 켠다.