정규 표현식
복잡한 문자열을 처리할때 사용하는 기법
메타문자: 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
. ^ $ * + ? { } [ ] \ | ( )
[ ] 사이의 문자들과 매치하는지 확인
[a-zA-Z]
:알파벳 모두[0-9]
: 숫자[ ] 안에 ^
가 앞에 있으면 ^ 뒤에있는 것들이 들어가는 것들을 제외한다는 뜻이다.
[^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
을 제외한 모든 문자와 매치됨
이해를 돕기 위해 문자열 "aab", "a0b", "abc"가 정규식 a.b
와 어떻게 매치되는지 살펴보자.
.
과 일치하므로 정규식과 매치된다..
과 일치하므로 정규식과 매치된다.*
바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미
정규식 | 문자열 | Match 여부 | 설명 |
---|---|---|---|
ca*t | ct | Yes | "a"가 0번 반복되어 매치 |
ca*t | cat | Yes | "a"가 0번 이상 반복되어 매치 (1번 반복) |
ca*t | caaat | Yes | "a"가 0번 이상 반복되어 매치 (3번 반복) |
+
최소 1번 이상 반복될대 사용
정규식 | 문자열 | Match 여부 | 설명 |
---|---|---|---|
ca+t | ct | No | "a"가 0번 반복되어 매치되지 않음 |
ca+t | cat | Yes | "a"가 1번 이상 반복되어 매치 (1번 반복) |
ca+t | caaat | Yes | "a"가 1번 이상 반복되어 매치 (3번 반복) |
반복 횟수를 3회만 또는 1회부터 3회까지 제한하고 싶을 경우
1. {m}
ca{2}t
위 정규식의 의미는 다음과 같다.
"c + a(반드시 2번 반복) + t"
위 정규식에 대한 매치여부는 다음 표와 같다.
정규식 | 문자열 | Match 여부 | 설명 |
---|---|---|---|
ca{2}t | cat | No | "a"가 1번만 반복되어 매치되지 않음 |
ca{2}t | caat | Yes | "a"가 2번 반복되어 매치 |
2. {m, n}
ca{2,5}t
위 정규식의 의미는 다음과 같다:
"c + a(2~5회 반복) + t"
위 정규식에 대한 매치여부는 다음 표와 같다.
정규식 | 문자열 | Match 여부 | 설명 |
---|---|---|---|
ca{2,5}t | cat | No | "a"가 1번만 반복되어 매치되지 않음 |
ca{2,5}t | caat | Yes | "a"가 2번 반복되어 매치 |
ca{2,5}t | caaaaat | Yes | "a"가 5번 반복되어 매치 |
3. ?
반복은 아니지만 이와 비슷한 개념으로 ?
이 있다. ?
메타문자가 의미하는 것은 {0, 1}
이다.
다음 정규식을 보자.
ab?c
위 정규식의 의미는 다음과 같다:
"a + b(있어도 되고 없어도 된다) + c"
위 정규식에 대한 매치여부는 다음 표와 같다.
정규식 | 문자열 | Match 여부 | 설명 |
---|---|---|---|
ab?c | abc | Yes | "b"가 1번 사용되어 매치 |
ab?c | ac | Yes | "b"가 0번 사용되어 매치 |
즉 b 문자가 있거나 없거나 둘 다 매치되는 경우이다.
Method | 목적 |
---|---|
match() | 문자열의 처음부터 정규식과 매치되는지 조사한다. |
search() | 문자열 전체를 검색하여 정규식과 매치되는지 조사한다. |
findall() | 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다. |
finditer() | 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다. |
참고