[] 사이에 있는 글자 중 하나와 매치하는지를 나타낸다. 두 문자 사이에 -을 사용하면 두 문자 사이의 범위를 의미한다. [] 안에는 어떤 메타 문자도 들어갈 수 있으나, ^는 반대를 의미하므로 주의하자.
| 정규 표현식 | Description |
|---|---|
| \d | 숫자와 매치 |
| \D | 숫자가 아닌 것과 매치 |
| \s | 공백 문자와 매치 |
| \S | 공백 문자가 아닌 것과 매치 |
| \w | 문자 + 숫자와 매치 |
| \W | 문자 + 숫자 가 아닌 것과 매치 |
.는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
a.b에서 abc는 매치가 이뤄지지만 acd는 매치가 되지 않는다. 정규표현식이 아닌 문자열 a.b과 매치하기 위해서는 정규표현식을 a[.]b로 작성해야한다.
*은 바로 앞에 있는 문자가 0부터 무한대로 반복될 수 있음을 말한다.
+는 바로 앞에 있는 문자가 최소 1번 이상 반복될 수 있음을 말한다.
{m,n}은 m번 이상, n번 이하 반복을 의미한다. ?은 {0,1}을 의미한다.
파이썬에서는 정규표현식을 지원하는 re(regular expression) 모듈이 있다. 사용법은 다음과 같다.
import re
p = re.compile('ab*")
| Method | Purpose |
|---|---|
| match() | 문자열의 처음부터 정규식과 매치되는지 조사 |
| search() | 문자열 전체를 검색하여 정규식과 매치되는지 조사 |
| findall() | 정규식과 매치되는 모든 문자열을 리스트로 반환 |
| finditer() | 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 반환 |
match, search, finditer 등은 match 객체를 반환한다. match 객체의 메서드는 다음과 같다.
| Method | Purpose |
|---|---|
| group() | 매치된 문자열 반환 |
| start() | 매치된 문자열의 시작 위치 반환 |
| end() | 매치된 문자열의 끝 위치 반환 |
| span() | 매치된 문자열의(시작, 끝)에 해당하는 튜플 반환 |
[Tip] 다음과 같이 모듈 단위로 수행할 수 있다.
m = re.match('[a-z]+', "test")
| 옵션 이름 | 약어 | 설명 |
|---|---|---|
| DOTALL | S | dot 문자가 줄바꿈 문자를 포함하여 모든 문자와 매치 |
| IGNORECASE | I | 대/소문자 관계 없이 매치 |
| MULTILINE | M | 여러 줄과 매치 |
| VERBOSE | X | verbose 모드 사용 |
| 메타 문자 | 설명 |
|---|---|
| | | or와 동일한 의미로 사용된다. |
| ^ | 문자열의 맨 처음과 일치함을 의미한다. |
| $ | ^와 반대로, 문자열의 끝과 일치함을 의미한다. |
| \A | '전체' 문자열의 처음과 일치 |
| \Z | '전체' 문자열의 끝과 일치 |
| \b | 단어 구분자를 의미한다. 사용시 r(Raw String)을 사용해야한다. |
| \B | \b와 반대의 경우를 의미한다. |
()를 사용해서 계속해서 반복되는지 조사할 수 있다.
p = re.compile('(ABC)+')
m = p.search('ABCABCABC OK?')
print(m)
print(m.group(1))
group(n)은 n 번째 그룹에 해당하는 문자열을 의미한다. 0이 들어가는 매치된 전체 문자열을 의미한다. 그루핑을 중첩해서 사용하는 경우 인덱스는 바깥에서 안쪽 방향으로 증가한다. \1, \2 등을 통해 한 번 그루핑한 문자열을 재참조(Backreferences) 할 수 있다.
그룹에 이름을 다음과 같이 붙여 줄 수 있다.
(?P<group name>...)
그룹 이름을 통해 재참조도 가능하다. 재참조 할 때에는 확장 구문을 사용해야한다.
| 정규식 | 종류 | 설명 |
|---|---|---|
| (?=...) | 긍정형 전방 탐색 | ...에 해당하는 정규식과 매치되어야 하며 조건이 통과되어도 문자열이 소비되지 않는다. |
| (?!...) | 부정형 전방 탐색 | ...에 해당하는 정규식과 매치되지 않아야 하며 조건이 통과되어도 문자열이 소비되지 않는다. |
p = re.compile('(blue|white|red)')
p.sub('colour', 'blue socks white socks red socks')
count 값을 매개변수로 넘기면 바꾸는 횟수를 제한할 수 있다. subn 메소드는 sub와 동일한 기능을 하지만, 변환된 문자열과 변환 횟수를 튜플 형태로 반환한다.
\g<group name or index>를 통해 정규식 그룹을 참조할 수 있다.
sub의 첫 번째 매개변수로 함수를 사용할 경우 , 해당 함수의 첫 번째 매개변수에는 정규식과 매치된 match 객체가 입력된다.
'<.*>'는 <html>, <body> 등을 소비할 것이다. 문제는 하나만 소비하는게 아니라 주어진 문자열에 있는 모든 것을 소비한다는 것이다.
이 문제를 위해 '<.*?>', 즉 ?을 사용하여 최소한의 반복을 수행하도록 만들 수 있다.