소비가 없는 메타 문자

🖤devxyoon·2020년 10월 1일
0

+, *, [], {} 등의 메타 문자는 매치가 진행될 때 현재 매치되고 있는 문자열의 위치가 변경된다(보통 소비된다고 표현하다). 하지만 이와 달리 문자열을 소비시키지 않는 메타 문자도 있다.

|


| 메타 문자는 or과 동일한 의미로 사용된다. A|B라는 정규식이 있다면 A 또는 B라는 의미가 된다.
import re

p = re.compile('Crow|Serve')
m = p.match('CrowHello')
print(m)


<re.Match object; span=(0,4), match='Crow'>

^


^ 메타 문자는 문자열의 맨 처음과 일치함을 의미한다. re.MULTILINE을 사용할 경우에는 여러 줄의 문자열일 때 각 줄의 처음과 일치하게 된다.
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


\A는 문자열의 처음과 매치됨을 의미한다. ^ 메타 문자와 동일한 의미이지만 re.MULTILINE 옵션을 사용할 경우에는 다르게 해석된다. re.MULTILINE 옵션을 사용할 경우 ^은 각 줄의 문자열의 처음과 매치되지만 \A는 줄과 상관없이 전체 문자열의 처음하고만 매치된다.

\Z


\Z는 문자열의 끝과 매치됨을 의미한다. 이것 역시 \A와 동일하게 re.MULTILINE 옵션을 사용할 경우 $ 메타 문자와는 달리 전체 문자열의 끝과 매치된다.

\b


\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을 반드시 붙여줘야 한다.

\B


\B 메타 문자는 \b 메타 문자와 반대의 경우다. 즉, whitespace로 구분된 단어가 아닌 경우에만 매치된다.
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가 하나라도 있는 경우에는 매치가 안되는 것을 확인할 수 있다.

profile
서버는 죽지 않아요👼

0개의 댓글