Sangmun

정규표현식 기초 (메타문자) 본문

개발/정규표현식

정규표현식 기초 (메타문자)

상상2 2023. 1. 22. 13:32

정규표현식에서의 메타 문자란 원래 의미로 사용되지 않고 특별한 의미로 사용되는 문자를 말한다.

정규표현식에서의 메타 문자는 아래와 같은 것들이 있다.

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

문자 클래스 '[ ]'

'[ ]'사이의 문자들과의 매치라는 의미를 가지며

[abc]라는 정규표현식이 있다면 'a,b,c' 중 한개의 문자와의 매치를 의미한다. 예시를 들어보면 아래와 같이 적용이 된다.

  • "a"는 정규식과 일치하는 문자인 "a"가 있으므로 매치
  • "before"는 정규식과 일치하는 문자인 "b"가 있으므로 매치
  • "dude"는 정규식과 일치하는 문자인 a, b, c 중 어느 하나도 포함하고 있지 않으므로 매치되지 않음

'[ ]'안의 문자 사이에 하이픈을(-)을 사용하면 범위를 의미한다. 즉 [a-c]는 [abc]와 동일하다.

  • [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 - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
\W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.

 

Dot(.)

정규표현식의 '.' 메타문자는 줄바꿈 문자 '\n'를 제외하고 모든 문자와 매치됨을 의미한다.

즉 a.b 라고 하는 정규표현식이 있으면 'aab', 'a0b' 와는 매치가 되지만 'abc'와는 매치가 되지 않는다.

 

또한 a[.]b라고 하는 정규표현식은 위의 a.b 정규표현식과 혼동될 수 있으나 'a.b'와 같은 문자열과 매치가 됨으로 메타문자 '.'을 의미하는것이 아닌 Dot(.)문자 자체를 의미하는것이라고 볼 수 있다.

 

반복 (*)

반복(*) 메타 문자는 * 바로 앞의 문자가 0부터 무한대까지 반복이 될 수 있다라는 의미이다.

ca*t 라는 정규표현식이 있으면 *앞의 a라는 문자가 0부터 무한대까지 반복이 될 수 있다.

 

반복 (+)

반복(+) 메타 문자는 반복(*) 메타 문자와는 달리 1부터 무한대까지 반복 될 수 있음을 뜻한다.

즉 무조건 한번은 반복(+) 앞의 문자가 등장은 해야한다는 것이다.

 

반복 ({m,n}, ?)

위의 반복 메타 문자들은 무조건 무한대까지 범위가 정해져 있어서 사용처가 약간은 한정적이다. 반복되는 횟수를 제한하기 위해서는 다음과 같은 메타 문자를 사용하면 된다.

 

1. {m}

해당 횟수 만큼 반복이라는 의미이며 ca{2}t라는 정규표현식이 있으면 a가 무조건 두번 반복되는 문자열을 매칭을 한다.

 

2. {m, n}

m에서 n까지를 의미한다. ca{2,5}t는 a가 2에서 5회 반복하면 매칭이 된다.

 

3. ?

?는 {0,1}과 의미가 같다.

 

● 즉 메타 문자 '*', '+', '?'는 모두 같은 의미를 가지는 {m,n}의 표현식으로 교체가 가능하지만 간결한 표현을 위해 사용한다고 보면 된다.

 

 

※ 아래의 메타 문자들은 위에 설명된 메타 문자들과는 성격이 조금 다르다. 위의 메타 문자들은 보통 매치가 되면 문자열의 위치가 변경된다(소비된다), 하지만 아래의 메타 문자들은 반대의 성격을 가지고 있다.

이러한 메타 문자들을 (zerowidth assertions) 이라고 한다.

| 문자

or 과 동일한 의미 이며 A|B 라는 정규식이 있다면 A 또는 B라는 의미이다.

또한 문자열이 소비되지 않기 때문에 Crow Hello 둘다 맞추는 것을 확인할 수 있다.

import re
p = re.compile('Crow|Hello')
m = p.finditer('CrowHello')
for each in m:
    print(each)
    
<re.Match object; span=(0, 4), match='Crow'>
<re.Match object; span=(4, 9), match='Hello'>

^문자

^ 메타 문자는 문자열의 맨처음과 일치함을 의미한다. re.MULTILINE 옵션을 사용하면 여러 줄을 매칭하게 됨으로 각 줄의 시작과 패턴이 일치한다면 매칭이된다. 해당 옵션이 없으면 정말로 딱 처음의 패턴만 탐지하게 된다.

print(re.search('^Life', 'Life is too short'))
<re.Match object; span=(0, 4), match='Life'>
print(re.search('^Life', 'My Life'))
None

$문자

$문자는 ^문자와 반대이다.

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 옵션을 사용해도 전체 문자열의 처음 하고만 매치가 된다.

\Z

해당 문자열도 $문자와 같은 의미지만 re.MULTILINE 옵션을 사용해도 전체 문자열의 끝하고만 매치가 된다.

\b

\b는 단어 구분자(word boundary)이며 whitespace에 의해 구분되어 있는 문자열만을 매칭한다.

p = re.compile(r'\bclass\b')
print(p.search('no class at all'))  
<re.Match object; span=(3, 8), match='class'>
print(p.search('the declassified algorithm'))
None

\B

\b와 반대로 whitespace로 구분된 단어가 아닌 경우에 매칭이 된다.

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'))

 

출처 : https://wikidocs.net/4308

 

'개발 > 정규표현식' 카테고리의 다른 글

정규표현식 심화  (0) 2023.01.23
정규표현식 기초 python re 모듈  (0) 2023.01.22
Comments