복잡한 문자열을 처리할 때 사용하는 기법.
파이썬만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용된다.
예를 들어, 주민등록번호를 포함하고 있는 텍스트가 있다. 이 텍스트에 포함된 모든 주민등록번호의 뒷자리를 *
문자로 변경해 보자.
이 때에 정규 표현식을 이용하지 않은 경우.
split
).*
로 변환한다. (리스트에 *
들 추가해주기)그러나, 정규 표현식을 이용하면 한 줄로 만들 수 있다.
import re
data = """
park 800905-1049118
kim 700905-1059119
"""
pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))
메타문자란?
원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
아래와 같은 문자들이 메타 문자이다.
. ^ $ * + ? { } [ ] \ | ( )
문자 클래스로 만들어진 정규식은 "[] 사이의 문자들과 매치"라는 의미를 갖는다.
즉, 정규 표현식이 [abc]
라면 "a, b, c 중 한 개의 문자와 매치"를 뜻한다.
문자열 "a", "before", "dude"
가 정규식 [abc]
와 어떻게 매치되는지 살펴보자.
"a"
는 정규식과 일치하는 문자인 "a"
가 있으므로 매치"before"
는 정규식과 일치하는 문자인 "b"
가 있으므로 매치"dude"
는 정규식과 일치하는 문자인 a, b, c
중 어느 하나도 포함하고 있지 않으므로 매치되지 않음두 문자 사이의 범위를 의미한다.
[a-c]
라는 정규 표현식은 [abc]
와 동일하고 [0-5]
는 [012345]
와 동일
문자 클래스 안에 ^
메타 문자를 사용할 경우에는 반대(not)라는 의미를 갖는다.
[^0-9]
라는 정규 표현식은 숫자가 아닌 문자만 매치된다.
[자주 사용하는 문자 클래스]
[0-9]
또는[a-zA-Z]
등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.
\d
- 숫자와 매치,[0-9]
와 동일한 표현식이다.
\D
- 숫자가 아닌 것과 매치,[^0-9]
와 동일한 표현식이다.
\s
- whitespace 문자와 매치,[ \t\n\r\f\v]
와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
\S
- whitespace 문자가 아닌 것과 매치,[^ \t\n\r\f\v]
와 동일한 표현식이다.
\w
- 문자+숫자(alphanumeric)와 매치,[a-zA-Z0-9_]
와 동일한 표현식이다.
\W
- 문자+숫자(alphanumeric)가 아닌 문자와 매치,[^a-zA-Z0-9_]
와 동일한 표현식이다.
대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다.
Dot(.) 메타 문자는 줄바꿈 문자인 \n
을 제외한 모든 문자와 매치됨을 의미한다.
a.b
"a + 모든문자 + b"
a[.]b
"a + Dot(.)문자 + b"
찐 Dot(.)을 찾는 것.
*
은 *
바로 앞에 있는 문자 a
가 0부터 무한대로 반복될 수 있다는 의미
ca*t
+
는 최소 1번 이상 반복될 때 사용한다.(바로 앞의 문자가 최소 1번)
ca+t
반복 횟수를 3회만 또는 1회부터 3회까지만으로 제한하고 싶으면?
{m(부터), n(까지)}
또한 m
또는 n
을 생략할 수도 있다. 만약 {3,}
처럼 사용하면 반복 횟수가 3 이상인 경우이고 {,3}
처럼 사용하면 반복 횟수가 3 이하를 의미한다.
{m}
ca{2}t
"c + a(반드시 2번 반복) + t"
2. {m, n}
ca{2, 5}t
3. ?
?
메타문자가 의미하는 것은 {0, 1}
이다.
ab?c
"a + b(있어도 되고 없어도 된다) + c"