파이썬 정규식 관련 기능은 re 모듈에 들어있다. 컴파일해서 사용할 수도 있고, 바로 사용할 수도 있는데, 자세한 것은 파이썬 매뉴얼을 참고.
검색에는 match, search, findall, finditer 이 4가지 함수를 이용할 수 있다.
match 함수는 문자열의 제일 앞쪽부터 주어진 정규식과 일치하는지를 검사한다. 정규식과 일치한다면 MatchObject를 반환하고, 일치하지 않는다면 None을 반환한다.
match(pattern, string[, flags])
import re print(re.match("[a-z]+", "abcd")) print(re.match("[a-z]+", "abcd12")) print(re.match("[a-z]+", "12abcd")) print(re.match("[a-z]+", "1234"))
<_sre.SRE_Match object at 0x00B368E0> <_sre.SRE_Match object at 0x00B368E0> None None
MatchObject의 기능은 다음과 같다.
함수 | 목적 |
---|---|
group(index) | 정규식과 일치하는 부분의 문자열을 반환한다. |
start(index) | 일치하는 부분이 원래 문자열에서 차지하는 시작 인덱스를 반환한다. |
end(index) | 일치하는 부분이 원래 문자열에서 차지하는 끝 인덱스를 반환한다. |
span(index) | 일치하는 부분의 시작과 끝 인덱스를 반환한다. |
함수 인자로 들어가는 값은 index 값은 그룹화된 정규식일 경우, 해당하는 그룹의 인덱스다. 주지 않을 경우 기본값으로 0을 사용한다.
import re m = re.match("[a-z]+", "abcd12") print(m.group()) print(m.start(0)) print(m.end(0)) print(m.span())
abcd 0 4 (0, 4)
search 함수는 문자열의 처음이 아니라, 전체를 검사한다는 점을 빼면 match 함수와 크게 다를 것이 없다.
search( pattern, string[, flags])
import re m = re.search("[a-z]+", "12abcd") print(m.group()) print(m.span())
abcd (2, 6)
findall 함수는 정규식과 일치하는 모든 문자열들을 찾아, 그 문자열들을 리스트로 반환한다.
findall( pattern, string[, flags])
import re list = re.findall("[a-z]+", "abcd12efgh") print(list)
['abcd', 'efgh']
finditer 함수는 문자열 대신에 MatchObject의 리스트를 반환한다.
finditer( pattern, string[, flags])
import re list = re.finditer("[a-z]+", "abcd12efgh") for match in list: print(match.span())
(0, 4) (6, 10)
치환에는 split, sub, subn 이 3가지 함수를 이용할 수 있다.
split 함수는 주어진 정규식을 기준으로 문자열을 나누어, 그 리스트를 반환한다. 괄호를 쓰지 않으면 정규식과 일치하는 부분의 문자열은 날아간다.
split( pattern, string[, maxsplit = 0])
import re list = re.split("[a-z]+", "abcd12efgh") print(list)
['', '12', '']
import re list = re.split("([a-z]+)", "abcd12efgh") print(list)
['', 'abcd', '12', 'efgh', '']
sub 함수는 정규식과 일치하는 부분의 문자열을 주어진 문자열로 치환한다.
sub( pattern, repl, string[, count])
import re list = re.sub("([a-z]+)", "wxyz", "abcd12efgh") print(list)
wxyz12wxyz
subn 함수는 반환값이 ('치환한 문자열', 치환 횟수)의 튜플이라는 점만 빼고는, sub 함수와 똑같다.
subn( pattern, repl, string[, count])
import re list = re.subn("([a-z]+)", "wxyz", "abcd12efgh") print(list)
('wxyz12wxyz', 2)