일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 마케팅
- 파킹통장
- GA설치
- 파이썬
- 파이썬정규표현식
- 파킹통장추천
- 구글애널리틱스4
- GA강의
- 구글애널리틱스강의
- 파이썬공부
- 책추천
- GA
- GA4
- GA공부
- 구글애널리틱스공부
- 파이썬함수
- 파이썬문자열
- 구글ads
- GA가이드
- 구글애널리틱스가이드
- 카페24
- 유튜브
- 파이썬프로그래밍
- 페이스북광고
- 국민내일배움카드
- 파이썬내장함수
- 신용카드추천
- 유튜브광고
- 구글애널리틱스
- 메이크샵
- Today
- Total
정리왕
정규 표현식 시작하기 본문
정규 표현식의 기초, 메타 문자
정규 표현식에서 사용하는 메타 문자 (meta characters)에는 다음과 같은 것이 있다.
. ^ % * + ? { } [ ] \ | ( )
★메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
정규 표현식에 위 메타 문자를 사용하면 특별한 의미를 갖게 된다.
자, 그러면 가장 간단한 정규 표현식부터 시작해 각 메타 문자의 의미와 사용법을 알아보자.
문자 클래스 [ ]
우리가 가장 먼저 살펴볼 메타 문자는 바로 문자 클래스(character class)인 [ ]이다. 문자 클래스로 만들어진 정규식은 '[ ]사이의 문자들과 매치' 라는 의미를 갖는다. 문자 클래스를 만드는 메타 문자인 [ ] 사이에는 어떤 문자도 들어갈 수 있다.
즉, 정규표현식이 [abc]라면 이 표현식의 의미는 'a, b, c 중 한 개의 문자와 매치'를 뜻한다.
이해를 돕기 위해 문자열 "a", "before", "dude"가 정규식 [abc]와 어떻게 매치되는지 살펴 보자.
정규식 | 문자열 | 매치여부 | 설명 |
[abc] | a | Yes | "a"는 정규식과 일치하는 문자인 "a"가 있으므로 매치 |
before | Yes | "before"는 정규식과 일치하는 문자인 "b"가 있으므로 매치 | |
dude | No | "dude"는 정규식과 일치하는 문자인 a, b, c 중 어느 하나도 포함하고 있지 않으므로 매치되지 않음 |
[ ]안의 두 문자 사이에 하이픈( - )을 사용하면 두 문자 사이의 범위(From - To)를 의미한다. 예를 들어 [a-c]라는 정규 표현식은 [abc]와 동일하고 [0-5]는 [012345]와 동일하다.
문자 클래스([ ]) 안에는 어떤 문자나 메타 문자도 사용할 수 있지만 주의해야 할 메타 문자가 1가지 있다. 그것은 바로 ^인데, 문자 클래스 안에 ^ 메타 문자를 사용할 경우에는 반대(not)라는 의미를 갖는다. 예를 들어 [^0-9]라는 정규 표현식은 숫자가 아닌 문자만 매치된다.
[a-zA-Z] : 알파벳 모두
[0-9] : 숫자
★ 자주 사용하는 문자 클래스
[0-9] 또는 [a-zA-Z] 등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식은 별도의 표시법으로 표현할 수 있다. 다음을 기억해 두자.
정규 표현식 | 설명 |
\d | 숫자와 매치, [0-9]와 동일한 표현식이다. |
\D | 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다. |
\s | whitespace 문자(space나 tab처럼 공백을 표현하는 문자)와 매치, [\t\n\r\f\v] 와 동일한 표현식이다. 맨 앞의 빈칸은 공백 문자(space)를 의미한다. |
\S | whitespace 문자가 아닌 것과 매치. [^ \t\n\t\f\v] 와 동일한 표현식이다. |
\w | 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다. |
\W | 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다. |
대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다.
Dot(.)
정규 표현식의 Dot(.)메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
나중에 배우겠지만 정규식을 작성할 때 re.DOTALL 옵션을 주며 \n 문자와도 매치된다.
다음 정규식을 보자.
a.b =>a와 b사이에 줄바꿈 문자를 제외한 어떤 문자가 들어가도 모두 매치
위 정규식의 의미는 "a + 모든문자 + b"와 같다. 즉 a와 b라는 문자사이에 어떤 문자가 들어가도 모두 매치된다는 의미이다.
이해를 돕기 위해 문자열 "aab", "a0b", "abc"가 정규식 a.b와 어떻게 매치되는지 살펴보자.
정규식 | 문자열 | 매치 여부 | 설명 |
a.b | aab | Yes | "aab"는 가운데 문자 "a"가 모든 문자를 의미하는 .과 일치하므로 정규식과 매치 |
a0b | Yes | "a0b"는 가운데 문자 "0"이 모든 문자를 의미하는 .과 일치하므로 정규식과 매치 | |
abc | No | "abc"는 "a"문자와 "b"문자 사이에 어떤 문자라도 하나는 있어야 하는 이 정규식과 일치하지 않으므로 매치되지 않음 |
다음 정규식을 보자.
a[.]b =======> a 와 b 사이에 Dot(.) 문자가 있으면 매치
이 정규식의 의미는 "a + Dot(.)문자 + b"와 같다. 따라서 정규식 a[.]b는 "a.b" 문자열과 매치되고, "a0b" 문자열과는 매치되지 않는다.
만약 앞에서 살펴본 문자 클래스([]) 안에 Dot(.) 메타 문자가 사용된다면 이것은 '모든 문자'라는 의미가 아닌 문자 . 그대로를 의미한다. 혼동하지 않도록 주의하자.
반복(*)
다음 정규식을 보자.
ca*t =====> * 문자 바로 앞에 있는 a가 0번 이상 반복되면 매치
이 정규식에는 반복을 의미하는 * 메타 문자가 사용되었다. 여기에서 사용한 *은 *바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미이다.
여기에서 * 메타 문자의 반복 개수가 무한대라고 표현했는데 사실 메모리 제한으로 2억 개 정도만 가능하다고 한다.
즉 다음과 같은 문자열이 모두 매치된다.
정규식 | 문자열 | 매치 여부 | 설명 |
ca*t | ct | Yes | "a"가 0번 반복되어 매치 |
cat | Yes | "a"가 0번 이상 반복되어 매치 (1번 반복) | |
caaat | Yes | "a"가 0번 이상 반복되어 매치 (3번 반복) |
반복(+)
반복을 나타내는 또 다른 메타 문자로 + 가 있다.
+는 최소 1번 이상 반복될 때 사용한다. 즉 *가 반복 횟수 0부터라면 + 는 반복 횟수 1부터인 것이다.
다음 정규식을 보자.
ca+t ======> + 문자 바로 앞에 있는 a가 1번 이상 반복되면 매치
위 정규식 의미는 "c + a(1번 이상 반복) + t" 라 같고, 정규식에 대한 매치여부는 다음 표와 같다.
정규식 | 문자열 | 매치 여부 | 설명 |
ca+t | ct | No | "a"가 0번 반복되어 매치되지 않음 |
cat | Yes | "a"가 1번 이상 반복되어 매치 (1번 반복) | |
caaat | Yes | "a"가 1번 이상 반복되어 매치 (3번 반복) |
반복({m,n},?)
여기에서 잠깐 생각해 볼 게 있다. 반복 횟수를 3회만 또는 1회부터 3회까지만으로 제한하고 싶을 수도 있지 않을까?
{ } 메타 문자를 사용하면 반복 횟수를 고정할 수 있다. {m,n} 정규식을 사용하면 반복 횟수가 m부터 n까지 매치할 수 있다. 또한 m 또는 n을 생략할 수도 있다. 만약 {3,}처럼 사용하면 반복 횟수가 3 이상인 경우이고 {,3}처럼 사용하면 반복 횟수를 3 이하를 의미한다. 생략된 m은 0과 동일하며, 생략된 n은 무한대(2억 개 미만)의 의미를 갖는다.
{1,}은 +와 동일하고, {0,}은 *와 동일하다.
{ }을 사용한 몇 가지 정규식을 살펴보자.
1) {m}
ca{2}t =====> a가 2번 반복되면 매치
위 정규식의 의미는 "c + a(반드시 2번 반복) + t" 와 같고, 정규식에 대한 매치여부는 다음 표와 같다.
정규식 | 문자열 | 매치 여부 | 설명 |
ca{2}t | cat | No | "a"가 1번만 반복되어 매치되지 않음 |
caat | Yes | "a"가 2번 반복되어 매치 |
2) {m,n}
ca{2,5}t ====> a가 2~5번 반복되며 매치
위 정규식의 의미는 "c + a(2~5번 반복) + t" 와 같고, 정규식에 대한 매치여부는 다음 표와 같다.
정규식 | 문자열 | 매치 여부 | 설명 |
ca{2,5}t | cat | No | "a"가 1번만 반복되어 매치되지 않음 |
caat | Yes | "a"가 2번 반복되어 매치 | |
caaaat | Yes | "a"가 5번 반복되어 맻리 |
3) ?
반복은 아니지만 이와 비슷한 개념으로 ?이 있다. ? 메타 문자가 의미하는 것은 {0, 1} 이다.
다음 정규식을 보자.
ab?c ======> b가 0~1번 사용되면 매치
위 정규식의 의미는 "a + b(있어도 되고 없어도 된다) + c" 와 같고, 정규식에 대한 매치 여부는 다음과 같다.
정규식 | 문자열 | 매치여부 | 설명 |
ab?c | abc | Yes | "b"가 1번 사용되어 매치 |
ac | Yes | "b"가 0번 사용되어 매치 |
즉 b 문자가 있거나 없거나 둘 다 매치되는 경우이다.
*, +, ? 메타 문자는 모두 {m, n} 형태로 고쳐 쓰는 것이 가능하지만 가급적 이해하기 쉽고 표현도 간결한 *, +, ? 메타 문자를 사용하는 것이 좋다.
지금까지 아주 기초적인 정규 표현식에 대해서 알아보았다. 알아야 할 것들이 아직 많이 남아 있지만 그에 앞에서 파이썬으로 이러한 정규 표현식을 어떻게 사용할 수 있는지 먼저 알아보기로 하자.
'6.개발 > 파이썬 공부하기' 카테고리의 다른 글
강력한 정규 표현식의 세계로 (0) | 2020.12.05 |
---|---|
파이썬에서 정규 표현식을 지원하는 re 모듈 (0) | 2020.12.05 |
정규표현식 살펴보기 (0) | 2020.12.05 |
간단한 메모장 만들기 (0) | 2020.12.05 |
3과 5의 배수 합치기 (0) | 2020.12.05 |