습관처럼
python - regex(정규표현식) 본문
정규 표현식에서 사용하는 메타 문자(meta characters)에는 다음과 같은 것이 있다.
메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
. ^ $ * + ? { } [ ] \ | ( )
정규 표현식에 위 메타 문자를 사용하면 특별한 의미를 갖게 된다.
문자 클래스 []
문자 클래스로 만들어진 정규식은 "[ ] 사이의 문자들과 매치"라는 의미를 갖는다.
정규 표현식이 [abc]라면 이 표현식의 의미는 "a, b, c 중 한 개의 문자와 매치"를 뜻한다. 이해를 돕기 위해 문자열 "a", "before", "dude"가 정규식 [abc]와 어떻게 매치되는지 살펴보자.
"a"는 정규식과 일치하는 문자인 "a"가 있으므로 매치
"before"는 정규식과 일치하는 문자인 "b"가 있으므로 매치
"dude"는 정규식과 일치하는 문자인 a, b, c 중 어느 하나도 포함하고 있지 않으므로 매치되지 않음
[ ] 안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위(From - To)를 의미한다.
예를 들어 [a-c]라는 정규 표현식은 [abc]와 동일하고 [0-5]는 [012345]와 동일하다.
[a-zA-Z] : 알파벳 모두,
[0-9] : 숫자 모두
문자 클래스([ ]) 안에는 어떤 문자나 메타 문자도 사용할수 있지만 주의해야 할 메타 문자가 1가지 있다.
문자 클래스 안에 ^ 메타 문자를 사용할 경우에는 반대(not)라는 의미를 갖는다. 예를 들어 [^0-9]라는 정규 표현식은 숫자가 아닌 문자만 매치된다.
dot
정규 표현식의 Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
a.b
>>"a + 모든문자 + b"
a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다는 의미이다.
a[.]b
>>"a + Dot(.)문자 + b"
따라서 정규식 a[.]b는 "a.b" 문자열과 매치되고, "a0b" 문자열과는 매치되지 않는다.
※만약 앞에서 살펴본 문자 클래스([]) 내에 Dot(.) 메타 문자가 사용된다면 이것은 "모든 문자"라는 의미가 아닌 문자 . 그대로를 의미한다. 혼동하지 않도록 주의하자.
반복(*)
ca*t
이 정규식에는 반복을 의미하는 * 메타 문자가 사용되었다. 여기에서 사용한 *은 * 바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미이다.
정규식 | 문자열 | Match 여부 | 설명 |
ca*t | ct | Yes | "a"가 0번 반복되어 매치 |
ca*t | cat | Yes | "a"가 0번 이상 반복되어 매치 (1번 반복) |
ca*t | caaat | Yes | "a"가 0번 이상 반복되어 매치 (3번 반복) |
반복(+)
반복을 나타내는 또 다른 메타 문자로 +가 있다. +는 최소 1번 이상 반복될 때 사용한다. 즉 *가 반복 횟수 0부터라면 +는 반복 횟수 1부터인 것이다.
ca+t
>>"c + a(1번 이상 반복) + t"
정규식 | 문자열 | Match 여부 | 설명 |
ca+t | ct | No | "a"가 0번 반복되어 매치되지 않음 |
ca+t | cat | Yes | "a"가 1번 이상 반복되어 매치 (1번 반복) |
ca+t | caaat | Yes | "a"가 1번 이상 반복되어 매치 (3번 반복) |
반복({m,n},?)
{ } 메타 문자를 사용하면 반복 횟수를 고정할 수 있다.
{m, n} 정규식을 사용하면 반복 횟수가 m부터 n까지 매치할 수 있다. 또한 m 또는 n을 생략할 수도 있다. 만약 {3,}처럼 사용하면 반복 횟수가 3 이상인 경우이고 {,3}처럼 사용하면 반복 횟수가 3 이하를 의미한다. 생략된 m은 0과 동일하다.
※ {1,}은 +와 동일하고, {0,}은 *와 동일하다.
ca{2}t #"c + a(반드시 2번 반복) + t"
ca{2,5}t #"c + a(2~5회 반복) + t"
ab?c #"a + b(있어도 되고 없어도 된다) + c"
정규식 | 문자열 | Match 여부 | 설명 |
ca{2}t | cat | No | "a"가 1번만 반복되어 매치되지 않음 |
ca{2}t | caat | Yes | "a"가 2번 반복되어 매치 |
ca{2,5}t | cat | No | "a"가 1번만 반복되어 매치되지 않음 |
ca{2,5}t | caat | Yes | "a"가 2번 반복되어 매치 |
ca{2,5}t | caaaaat | Yes | "a"가 5번 반복되어 매치 |
ab?c | abc | Yes | "b"가 1번 사용되어 매치 |
ab?c | ac | Yes | "b"가 0번 사용되어 매치 |
'Language > python' 카테고리의 다른 글
Python: _(언더바) - 알고리즘편 (0) | 2020.01.19 |
---|---|
python - 정규식을 이용한 문자열 검색 (0) | 2019.12.22 |
python - string(2) (0) | 2019.12.22 |
python - string(1) (0) | 2019.12.22 |
python - lambda (0) | 2019.12.22 |