메타문자 (Metacharacters)

정규표현식에서 메타문자 (metacharacters)는 특별한 의미를 가집니다.

아래와 같은 다양한 종류의 메타문자가 사용됩니다.

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


메타문자의 사용에 대해 예제와 함께 알아봅니다. 순서는 아래와 같습니다.


1. Square brackets - []

[] 는 일치하는 문자들의 집합을 지정하기 위해 사용합니다.

예제

import re

pattern = '[abc]'

print(re.findall(pattern, 'a'))
print(re.findall(pattern, 'ab'))
print(re.findall(pattern, 'banana'))
['a']
['a', 'b']
['b', 'a', 'a', 'a']

pattern = ‘[abc]’는 문자 a, b, c의 집합입니다. a, b, c 중 하나라도 일치하면, 일치하는 문자가 됩니다.

re.findall() 함수는 패턴 (pattern)과 일치하는 문자열을 리스트의 형태로 반환합니다.

‘banana’의 경우 순서대로 ‘b’, ‘a’, ‘a’, ‘a’ 네 개의 문자가 일치해서 리스트 [‘b’, ‘a’, ‘a’, ‘a’]를 반환합니다.

더 자세한 내용은 정규표현식 집합 (Sets) 페이지를 참고하세요.


2. Period - .

.는 모든 하나의 문자와 일치합니다. (새 줄 ‘\n’은 제외)

예제

import re

pattern = '.'
pattern2 = '...'

print(re.findall(pattern, 'a'))
print(re.findall(pattern, 'ab'))
print(re.findall(pattern, 'banana'))

print(re.findall(pattern2, 'a'))
print(re.findall(pattern2, 'ab'))
print(re.findall(pattern2, 'banana'))
['a']
['a', 'b']
['b', 'a', 'n', 'a', 'n', 'a']
[]
[]
['ban', 'ana']

pattern = ‘.’는 모든 한 개의 문자와 일치합니다.

따라서 ‘banana’와는 문자 하나하나 일치해서 모든 문자의 리스트 [‘b’, ‘a’, ‘n’, ‘a’, ‘n’, ‘a’]를 출력합니다.


마찬가지로 pattern2 = ‘…’는 세 개 문자와 일치합니다.

re.findall() 함수는 겹치지 않도록 일치 여부를 확인하기 때문에, ‘banana’와는 ‘ban’, ‘ana’와 일치합니다.


3. Caret - ^

^는 특정한 문자로 시작되는 문자열과 일치합니다.

예제

import re

pattern = '^a'
pattern2 = '^car'

print(re.findall(pattern, 'abc'))
print(re.findall(pattern, 'apple'))

print(re.findall(pattern2, 'career'))
print(re.findall(pattern2, 'minicar'))
['a']
['a']
['car']
[]

pattern = ‘^a’ 는 ‘a’로 시작하는 문자열을 확인합니다.

pattern2 = ‘^car’ 는 ‘car’로 시작하는 문자열을 확인합니다.


4. Dollar - $

$는 특정한 문자로 끝나는 문자열과 일치합니다.

예제

import re

pattern = 'c$'
pattern2 = 'car$'

print(re.findall(pattern, 'abc'))
print(re.findall(pattern, 'apple'))

print(re.findall(pattern2, 'career'))
print(re.findall(pattern2, 'minicar'))
['c']
[]
[]
['car']

pattern = ‘c$’ 는 ‘c’로 끝나는 문자열을 확인합니다.

pattern2 = ‘car$’ 는 ‘car’로 끝나는 문자열을 확인합니다.


5. Star - *

**의 왼쪽에 위치한 문 자가 없거나 한 번 이상 나타나는 문자열과 일치합니다.

예제

import re

pattern = 'ab*'
pattern2 = 'car*'

print(re.findall(pattern, 'abc'))
print(re.findall(pattern, 'apple'))

print(re.findall(pattern2, 'career'))
print(re.findall(pattern2, 'minicar'))
print(re.findall(pattern2, 'cacao'))
['ab']
['a']
['car']
['car']
['ca', 'ca']

pattern = ‘ab*’ 는 ‘a’ 다음 ‘b’가 없거나 (한 번 이상) 나타나는 문자열과 일치합니다. 따라서 ‘apple’에서는 ‘a’와 일치합니다.

pattern2 = ‘car*’ 는 ‘ca’ 다음 ‘r’이 없거나 (한 번 이상) 나타나는 문자열과 일치합니다. 따라서 ‘cacao’에서는 ‘ca’, ‘ca’와 모두 일치합니다.


6. Plus - +

++의 왼쪽에 위치한 문자가 한 번 이상 나타나는 문자열과 일치합니다.

예제

import re

pattern = 'ab+'
pattern2 = 'car+'

print(re.findall(pattern, 'abc'))
print(re.findall(pattern, 'apple'))

print(re.findall(pattern2, 'career'))
print(re.findall(pattern2, 'minicar'))
print(re.findall(pattern2, 'cacao'))
['ab']
[]
['car']
['car']
[]

pattern = ‘ab+’ 는 ‘a’ 다음 ‘b’가 한 번 이상 나타나는 문자열과 일치합니다. 따라서 ‘apple’에서는 일치하지 않습니다.

pattern2 = ‘car+’ 는 ‘ca’ 다음 ‘r’이 한 번 이상 나타나는 문자열과 일치합니다. 따라서 ‘cacao’에서는 일치하지 않습니다.


7. Question Mark - ?

??의 왼쪽에 위치한 문자가 나타나지 않거나 한 번 나타나는 문자열과 일치합니다.

예제

import re

pattern = 'ab?c'

print(re.findall(pattern, 'ac'))
print(re.findall(pattern, 'abc'))
print(re.findall(pattern, 'abbc'))
['ac']
['abc']
[]

pattern = ‘ab?c’ 는 ‘a’와 ‘c’ 사이에 b가 나타나지 않거나 한 번 나타나는 경우와 일치합니다.

따라서 ‘abbc’는 일치하지 않습니다.


8. Braces - {}

{n,m}{n,m}의 왼쪽에 위치한 문자가 최소 n번, 최대 m번 나타나는 문자열과 일치합니다.

예제

import re

pattern = 'ab{1,3}c'

print(re.findall(pattern, 'ac'))
print(re.findall(pattern, 'abc'))
print(re.findall(pattern, 'abbc'))
print(re.findall(pattern, 'abbbc'))
print(re.findall(pattern, 'abbbbc'))
[]
['abc']
['abbc']
['abbbc']
[]

pattern = ‘ab{1,3}c’ 는 ‘a’와 ‘c’ 사이에 ‘b’가 적어도 한 번, 최대 세 번 나타나는 경우와 일치합니다.

따라서 ‘ac’와 ‘abbbbc’는 일치하지 않습니다.


9. Alternation - |

|는 or 연산자의 동작과 같습니다.

예를 들어, ‘a|b’는 문자 ‘a’ 또는 ‘b’와 일치합니다.

예제

import re

pattern = 'color|colour'

print(re.findall(pattern, 'This color is good.'))
print(re.findall(pattern, 'This colour is good.'))
['color']
['colour']

pattern = ‘color|colour’ 는 ‘color’ 또는 ‘colour’와 일치 여부를 확인합니다.


10. Group - ()

()는 서브패턴을 그룹화하기 위해 사용합니다.

예제

import re

pattern = 'col(o|ou)r'

print(re.findall(pattern, 'This color is good.'))
print(re.findall(pattern, 'This colour is good.'))
print(re.findall(pattern, 'This colou is good.'))
['o']
['ou']
[]

pattern = ‘col(o|ou)r’ 은 ‘col’과 ‘r’ 사이에 ‘o’ 또는 ‘ou’가 위치하는 경우와 일치합니다.

‘This colou is good.’는 뒤에 ‘r’이 나타나지 않기 때문에 일치하지 않습니다.


11. Backslash - \

\ 는 메타문자를 포함한 다양한 문자를 이스케이프하기 위해 사용합니다.

예를 들어, ‘\$a’는 ‘$a’와 일치하며, ‘$’는 메타문자로 인식되지 않습니다.

예제

import re

pattern = '$300'
pattern2 = '\$300'

print(re.findall(pattern, 'The price is $300'))
print(re.findall(pattern2, 'The price is $300'))
[]
['$300']

pattern2 = ‘\$300’과 같이 백슬래시를 사용해서 ‘$300’ 문자열과 일치 여부를 확인할 수 있습니다.