메타문자 또는 메타캐릭터는 정규 표현식엔진과 같은 컴퓨터 프로그램에 특별한 의미를 갖는 문자를 의미한다. 아래의 표로 정리할 수 있다.
메타문자 | 설명 | 예시 |
---|---|---|
. | 임의의 한 문자와 일치 (개행 문자를 제외한 모든 문자) | a.b 는 aab , acb 와 일치 |
^ | 문자열의 시작을 의미 | ^abc 는 abc 로 시작하는 문자열 |
$ | 문자열의 끝을 의미 | abc$ 는 abc 로 끝나는 문자열 |
* | 바로 앞의 문자가 0회 이상 반복됨을 의미 | a* 는 aa , a , 빈 문자열과 일치 |
+ | 바로 앞의 문자가 1회 이상 반복됨을 의미 | a+ 는 a , aa 와 일치 |
? | 바로 앞의 문자가 0회 또는 1회 나타남을 의미 | a? 는 a 또는 빈 문자열과 일치 |
{n} | 바로 앞의 문자가 정확히 n회 나타남을 의미 | a{3} 는 aaa 와 일치 |
{n,m} | 바로 앞의 문자가 n회 이상, m회 이하 나타남을 의미 | a{2,4} 는 aa , aaa , aaaa 와 일치 |
[] | 대괄호 내의 문자 중 하나와 일치 | [abc] 는 a , b , c 와 일치 |
` | ` | OR 연산자. 좌우 중 하나와 일치 |
() | 그룹을 정의하거나 캡처링 그룹을 지정 | (abc) 는 abc 와 일치 |
\ | 이스케이프 문자로, 메타문자 자체를 문자로 취급할 때 사용 | \. 는 . 문자와 일치 |
\d | 숫자와 일치 (0-9) | \d 는 0 부터 9 까지 숫자와 일치 |
\D | 숫자가 아닌 문자와 일치 | \D 는 숫자가 아닌 문자와 일치 |
\w | 단어 문자와 일치 (영문자, 숫자, 밑줄) | \w 는 a-z , A-Z , 0-9 , _ 와 일치 |
\W | 단어 문자가 아닌 것과 일치 | \W 는 단어 문자가 아닌 문자와 일치 |
\s | 공백 문자와 일치 (공백, 탭, 개행 등) | \s 는 공백 문자와 일치 |
\S | 공백 문자가 아닌 것과 일치 | \S 는 공백이 아닌 문자와 일치 |
| | 파이프 문자의 한 쪽에 있는 atom 중 하나를 일치시킵니다 | A(B|C)D는 ABD 및 ACD와 일치 |
플래그 | 설명 | 사용 예시 |
---|---|---|
re.I | 대소문자를 구분하지 않고 매칭합니다. | re.search(r'abc', 'ABC', re.I) 는 일치 |
re.M | ^ 와 $ 가 문자열의 각 줄마다의 시작과 끝을 의미하게 합니다. | re.search(r'^abc', 'abc\ndef', re.M) 는 첫 줄의 'abc'와 일치 |
re.S | . 이 개행 문자(\n )를 포함한 모든 문자와 일치하게 합니다. | re.search(r'a.b', 'a\nb', re.S) 는 일치 |
re.X | 정규식을 가독성 있게 작성할 수 있도록 공백과 주석을 허용합니다. | re.search(r'a\ b', 'a b', re.X) 는 일치 |
re.A | \w , \W , \b , \B , \d , \D , \s , \S 와 같은 메타문자를 ASCII(영문자)로만 해석합니다. | re.search(r'\w', 'é', re.A) 는 일치하지 않음 |
re.L | 현재 로케일에 맞춰서 정규식 매칭을 수행합니다. (로케일 설정에 따라 언어에 맞춘 매칭이 가능합니다) | 주로 로케일에 따른 문자 클래스를 사용할 때 유용 |
re.DEBUG | 정규식을 디버그 모드로 실행하여 처리 과정을 출력합니다. | re.compile(r'a.b', re.DEBUG) 는 디버그 정보 출력 |
re.U | 정규식에서 \w , \W , \b , \B , \d , \D , \s , \S 와 같은 메타문자를 유니코드 표준에 맞춰 해석합니다. | 파이썬 3에서는 기본적으로 이 플래그가 활성화됨 |
import re
# 이메일에서 사용자 이름과 도메인을 그룹으로 나누기
pattern = r'(\w+)@(\w+)\.(\w+)'
text = 'Contact us at info@example.com.'
match = re.search(pattern, text)
if match:
print(f"Username: {match.group(1)}") # 출력: Username: info
print(f"Domain: {match.group(2)}") # 출력: Domain: example
print(f"TLD: {match.group(3)}") # 출력: TLD: com
여기서 사용된 메타문자는 아래와 같다.
import re
# 공백 또는 쉼표로 문자열을 나누기
pattern = r'[ ,]+'
text = 'apple, orange banana,grape'
split_text = re.split(pattern, text)
print(split_text) # 출력: ['apple', 'orange', 'banana', 'grape']
여기서 사용된 메타문자는 아래와 같다.