+, *, [], {} 등의 메타 문자는 매치가 진행될 때 현재 매치되고 있는 문자열의 위치가 변경된다(보통 소비된다고 표현하다). 하지만 이와 달리 문자열을 소비시키지 않는 메타 문자도 있다.
import re
p = re.compile('Crow|Serve')
m = p.match('CrowHello')
print(m)
<re.Match object; span=(0,4), match='Crow'>
import re
print(re.search('^Life', 'Life is too short'))
<re.Match objectl span=(0,4), match='Life'>
print(re.search('^Life', 'My Life'))
None
^Life 정규식은 Life 문자열이 처음에 온 경우에는 매치하지만 처음 위치가 아닌 경우에는 매치되지 않음을 알 수 있다.
import re
print(re.search('short$', 'Life is too short'))
<re.Match object; span=(12, 17), match='short'>
print(re.search('short$', 'Life is too short, you need python'))
None
※ ^ 또는 $ 문자를 메타 문자가 아닌 문자 그 자체로 매치하고 싶은 경우에는 백슬래시를 사용하면 된다.
\A는 문자열의 처음과 매치됨을 의미한다. ^ 메타 문자와 동일한 의미이지만 re.MULTILINE 옵션을 사용할 경우에는 다르게 해석된다. re.MULTILINE 옵션을 사용할 경우 ^은 각 줄의 문자열의 처음과 매치되지만 \A는 줄과 상관없이 전체 문자열의 처음하고만 매치된다.
\Z는 문자열의 끝과 매치됨을 의미한다. 이것 역시 \A와 동일하게 re.MULTILINE 옵션을 사용할 경우 $ 메타 문자와는 달리 전체 문자열의 끝과 매치된다.
\b는 단어 구분자(Word boundary)이다. 보통 단어는 whitespace에 의해 구분된다.
import re
p = re.compile(r'\bclass\b')
print(p.search('no class at all'))
<re.Match object; span=(3, 8), match='class'>
\bclass\b 정규식은 앞뒤가 whitespace로 구분된 class라는 단어와 매치됨을 의미한다.
import re
p = re.compile(r'\bclass\b')
print(p.search('the declassified algorithm'))
None
print(p.search('one subclass is'))
None
\b 메타 문자를 사용할 때 주의해야 할 점이 있다. \b는 파이썬 리터럴 규칙에 의하면 백스페이스(backspace)를 의미하므로 백스페이스가 아닌 단어 구분자임을 알려 주기 위해 r'\bclass\b'처럼 Raw String임을 알려ㅓ주는 기호 r을 반드시 붙여줘야 한다.
import re
p = re.compile(r'\Bclass\B')
print(p.search('no class at all'))
None
print(p.search('the declassified algorithm'))
<re.Match object; span=(6, 11), match='class'>
print(p.search('one subclass is'))
None
class 단어의 앞뒤에 whitespace가 하나라도 있는 경우에는 매치가 안되는 것을 확인할 수 있다.