본문 바로가기

AI & Python

정규표현식(Regular Expression) with 파이썬 . ? + *기호 re.compile(), re.findall(), re.sub() (2)

이전 글에서는 정규표현식에서 사용하는 기호에 대해 설명했었는데요.
이번 글에서는 re모듈의 함수 활용법에 대해 알아보도록 하겠습니다.

 

re.match() 와 re.search()의 차이

search()가 정규 표현식 전체에 대해서 문자열이 매치하는지를 본다면, match()는 문자열의 첫 부분부터 정규 표현식과 매치하는지를 확인합니다. 문자열 중간에 찾을 패턴이 있다고 하더라도, match 함수는 문자열의 시작에서 패턴이 일치하지 않으면 찾지 않습니다.
import re
r=re.compile("ab.")
r.search("kkkabc")

r.match("kkkabc")  #아무런 결과도 출력되지 않는다.
r.match("abckkk")

r.search("abckkk")

 

re.split()

split() 함수는 입력된 정규 표현식을 기준으로 문자열들을 분리하여 리스트로 리턴합니다. 
자연어 처리에 있어서 가장 많이 사용되는 정규 표현식 함수 중 하나인데,
토큰화에 유용하게 쓰일 수 있기 때문입니다.
import re
text="사과 딸기 수박 메론 바나나"
re.split(" ",text)

위의 예제의 경우 입력 텍스트로부터 공백을 기준으로 문자열 분리를 수행하였고, 결과로서 리스트를 리턴하는 모습을 볼 수 있습니다.

import re
text="""사과
딸기
수박
메론
바나나"""
re.split("\n",text)

# python triple quote 사용 예제: multi-line format

s = '''name={0},
address={1},
nickname={2},
age={3},
comments=
"""
{4}
"""
'''
print(s.format("alice", "N/A", "alice", 18, "missing person"))

 

역 슬래시( \ )를 이용한 문자규칙

역슬래시 문자규칙

 

re.findall()

findall() 함수는 정규 표현식과 매치되는 모든 문자열들을 리스트로 리턴합니다.
단, 매치되는 문자열이 없다면 빈 리스트를 리턴합니다.
import re
text="""이름 : 김철수
전화번호 : 010 - 1234 - 1234
나이 : 30
성별 : 남"""  
re.findall("\d+",text) # 전체 텍스트로부터 숫자만 찾아내서 리스트로 리턴

re.findall("\D+",text) # 전체 텍스트로부터 숫자가 아닌 것만 찾아내서 리스트로 리턴

re.findall("\W+",text) # 전체 텍스트로부터 문자와 숫자가 아닌 것만 찾아내서 리스트로 리턴

 

re.sub()

sub() 함수는 정규 표현식 패턴과 일치하는 문자열을 찾아 다른 문자열로 대체할 수 있습니다.
print(re.sub("\W+^{\n}",'',text)) # newline을 제외하고 문자와 숫자가 아닌 것만 찾아내서 삭제.

text="""Regular expression : A regular expression, regex or regexp[1] (sometimes called a rational expression)[2][3] is, in theoretical computer science and formal language theory, a sequence of characters that define a search pattern."""
re.sub('[^a-zA-Z]',' ',text)

 

정규 표현식 텍스트 전처리 예제

import re  

text = """100 John    PROF
101 James   STUD
102 Mac   STUD"""  

print(re.split('\s+', text)) # '\s+'는 공백을 찾아내는 정규표현식입니다. 뒤에 붙는 +는 최소 1개 이상의 패턴을 찾아낸다는 의미입니다. 
print(text)

# 이제 해당 데이터로부터 숫자만을 뽑아온다고 해봅시다.

re.findall('\d+',text)

# 이번에는 텍스트로부터 대문자인 행의 값만 가져오고 싶다고 합시다. 

re.findall('[A-Z]',text)

# 이는 우리가 원하는 결과가 아닙니다. 이 경우, 여러가지 방법이 있겠지만 대문자가 연속적으로 4번 등장하는 경우로 조건을 추가해봅시다.

re.findall('[A-Z]{4}',text)

# 이름의 경우에는 대문자와 소문자가 섞여있는 상황입니다.  모든 이름을 매치시켜 봅시다.

re.findall('[A-Z][a-z]+',text)

 

정규표현식을 이용한 토큰화

NLTK에서는 정규 표현식을 사용해서 단어 토큰화를 수행하는 RegexpTokenizer를 지원합니다. RegexpTokenizer()에서 괄호 안에 원하는 정규 표현식을 넣어서 토큰화를 수행하는 것입니다.
import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer=RegexpTokenizer("\w+") # \+는 문자 또는 숫자가 1개 이상인 경우를 인식하는 코드입니다. 
                                   # 그렇기 때문에 이 코드는 문장에서 구두점을 제외하고, 단어들만을 가지고 토큰화를 수행
print(tokenizer.tokenize("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop"))

import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer=RegexpTokenizer("\s+", gaps=True) # gaps=true는 해당 정규 표현식을 토큰으로 나누기 위한 기준으로 사용한다는 의미
print(tokenizer.tokenize("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop"))

 

실습을 통해서 정규표현식에 대하여 알아보았는데,

어떠신가요? 문자열 데이터를 처리할때 유용할 것 같습니다. 정규표현식은 한번 익혀놓으면 편리하게 이용할 수 있다고 생각합니다. 자주 연습하셔서 업무에서 유용하게 사용하시길 바랍니다.

부족한 글 읽어 주셔서 감사합니다.

잘못된 내용 있으면 지적해주시면 감사하겠습니다.

 

히얀종이개발자