PS

파이썬 Regex 사용법

Recfli 2024. 1. 17. 22:13

[ 작성 이유 ]

 이전에 코딩테스트 공부를 하면서 Regex를 이용해서 문자열을 파싱했을 때 참 편리함을 느꼈었다. 그런데 오랜만에 다시 공부를 하면서 사용해보려고 하니 잘 생각이 나지 않았고 파이썬에서 Regex를 통해 파싱하는 방법을 다시 정리해보려고 한다.

[ Regex 작성 방법 ]

Regex를 사용하려면 pattern을 설정해야 한다.

 

주로 많이 쓰이는 패턴의 종류에 대해서 이야기를 하면 다음과 같다.

 

○ ' | ' : ' | '를 사용하면 패턴에서 매칭될 값들을 추가해줄 수 있다.

예시) (0 | 1)은 0과 1이면 매칭된다.

 

○ ' - ' : ' | '를 범위처럼 사용할 수 있다. ( 0 | 1 | 2 | 3 | 4 ) 이렇게 만들기가 귀찮으니 이걸 줄이는 방법이라고 생각하면 된다.

예시) (0-9) = 0부터 9까지, (a-z) = 소문자 0부터 9까지 (A-Z) = 대문자 A부터 Z까지, (0-9a-zA-Z) = 0부터 9까지거나 a부터 z까지거나 A부터 Z까지

 

○ ' . ' : '\n'를 제외한 모든 문자를 임의로 표현한다.

예시) 'a.b'이면 'a\nb'를 제외한 3개짜리 문자열 'aab', 'abb', 'a0b', 'a-b' 같은 게 매칭이 된다.

 

○ ' * ' : 앞에 있는 문자를 0개 또는 무한 개 매칭

예시) 'ca*t'이면 'ct', 'cat', 'caat', 'caaat' 같은 문자들이 매칭된다.

 

○ ' + ' : 앞에 있는 문자를 1번 또는 무한 개 매칭

예시) 'a+b'이면 'ab', 'aab', 'aaab' 같은 문자들이 매칭된다. 

 

○ ' {} ' : 내부 개수만큼 매칭

예시) 'c{2}t'이면 'caat'를 제외한 매칭되는 문자 없음. 'c{1,2}t'이면 'cat', 'caat'를 제외한 매칭되는 문자 없음.

 

○ ' ? ' : 0개거나 1개거나

예시) 'a?b'이면 'b' 혹은 'ab'만 매칭

 

○ ' [] ' : 문자 모음

예시) 'a.'면 'ab', 'ac' 같은게 매칭이 되겠지만 '[.]'면 문자 그대로 .만 매칭된다. 또한 [0-9a-zA-Z] 이렇게 내부에 전체적인 값을 여러개 적는 것도 가능

[ import re 모듈 사용 방법 ]

 앞에서 언급한 regex를 통해서 패턴 매칭을 한 번 해보자. 할 일은 문장에서 단어들만 토큰화 시키는 일이다. 문장은 소문자만 들어간다고 생각을 하자. 예시로 들 문장은 'it is raining outside.'이다.

 

그러면 pattern은 위를 생각해보면 a-z까지 문자열 중 하나를 1번 이상 반복한 패턴을 찾으면 된다. 그걸 이제 작성해보고 토큰화 시켜서 리스트로 출력을 하면 다음과 같이 나온다. 매우 간단하게 토큰을 추출이 가능하다.

import re

# ['it', 'is', 'raining', 'outside']
string = "it is raining outside"
pattern = re.compile('[a-z]+')

print(pattern.findall(string))

 

이 외에도 다른 기능을 제공한다. search와 match가 있는데 match는 처음부터 끝까지 문장의 모든 문자열이 해당 값과 일치하는 지를 찾는 것이고 search는 문장 중 일부가 해당 문자열과 일치하는지를 찾아준다.

# # <re.Match object; span=(0,6), match='python'>
print(pattern.match('python'))

# None
print(pattern.match('3 python'))

# <re.Match object; span=(0,6), match='python'>
print(pattern.search('python'))

# <re.Match object; span=(2,8), match='python'>
print(pattern.search('3 python'))

[ 참고 자료 ]

https://wikidocs.net/4308