# 메타문자1

***

정규 표현식에서 사용하는 메타 문자는 다음과 같습니다.

> . ^ $ \* + ? { } \[ ] \ | ( )

## 문자 클래스 \[]

**문자클래스 설명**

* ' \[ ] ' 사이의 문자들과 **매치** 라는 의미를 갖음.
* '\[abc]' 라면 이 표현식의 의미는 a,b,c 중 한개의 문자와 매치를 뜻함
  * "apple" 이라는 단어는 a를 포함하고있으므로 Matched
  * "fox" 라는 단어는 a,b,c 중 포함하고 있지 않으므로 Unmatched
* '\[ ]' 사이에 하이픈을 사용하면 'from - to' 를 의미.
  * '\[a-c]' 라는 정규식은 '\[abc]' 와 동일함.
  * '\[0-5]' 라는 정규식은 '\[012345]' 와 동일함.
  * '\[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 ' : 문자 + 숫자 와 매치, '\[a-zA-Z0-9\_]' 와 동일한 표현식.
* ' \W ' : 문자 + 수자 가 아닌 매치, '\[^a-zA-Z0-9\_]'와 동일 한 표현식.

**대문자로 사용은 소문자의 반대임을 알 수 있습니다,**

## Dot(.)

정규 표현식의 Dot(.) 메타 문자는 줄바꿈 문자인 '\n'을 제외한 모드 문자와 매치됨을 의미합니다.

re 라이브러리 사용시 re.DOTALL 옵션을 주면 \n 문자와도 매치됩니다.

1. **'a.b'**

위 정규식은 다음과 같습니다.

**' a + 모든문자 + b '** 즉 a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치 된다는 의미 입니다.

* 문자열 "aab","a0b","abc"가 정규식 a.b 와 매치되는지 확인.
  * "aab" 는 가운데 문자 "a"가 모든 문자를 의미하는 . 과 일치하므로 정규식과 매치.
  * "a0b" 는 가운데 문자 "0"이 모든 문자를 의미하는 . 과 일치하므로 정규식과 매치됩니다.
  * "abc" 는 "a"문자와 "b"문자 사이에 어떤 문자라도 하나는 있어야 하는 정규식과 일치 하지 않으므로 매치 되지 않습니다.

1. **'a\[.]b''**

이 정규식의 의미는 다음과 같습니다.\
&#xNAN;**"a + Dot(.)문자 + b"**

1. 정규식 '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을 생략 할수도 있습니다.

> {1,}는 +와 동일하고, {0,}는 \*과 동일 합니다.

1. '{m}' {}을 사용한 몇가지 정규식을 살펴보도록 하겠습니다.

| 정규식    | 문자열  | Match 여부 | 설명                    |
| ------ | ---- | -------- | --------------------- |
| ca{2}t | cat  | No       | "a"가 1번만 반복되어 매치되지 않음 |
| ca{2}t | caat | Yes      | "a"가 2번 반복되어 매치       |

1. '{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번 반복되어 매치       |

1. '?' 반복은 아니지만 비슷한 개념이 있습니다. ? 는 '{0,1}'를 의미합니다.

> **'ab?c'** : "a + b(있어도 되고 없어도 된다) + c"

| 정규식  | 문자열 | Match 여부 | 설명              |
| ---- | --- | -------- | --------------- |
| ab?c | abc | Yes      | "b"가 1번 사용되어 매치 |
| ab?c | ac  | Yes      | "b"가 0번 사용되어 매치 |

1. 반복 정리

* 이해하기 쉽고 표현도 간결한 '\*', '+', '?' 메타 문자를 사용하는 것이 좋습니다.
* '\*', '+', '?' 메타 문자는 모두 {'m', 'n'} 형태로 고쳐 쓰는 것이 가능합니다.
