이전 글에서는 정규표현식에서 사용하는 기호에 대해 설명했었는데요.
이번 글에서는 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"))
실습을 통해서 정규표현식에 대하여 알아보았는데,
어떠신가요? 문자열 데이터를 처리할때 유용할 것 같습니다. 정규표현식은 한번 익혀놓으면 편리하게 이용할 수 있다고 생각합니다. 자주 연습하셔서 업무에서 유용하게 사용하시길 바랍니다.
부족한 글 읽어 주셔서 감사합니다.
잘못된 내용 있으면 지적해주시면 감사하겠습니다.
히얀종이개발자
'AI & Python' 카테고리의 다른 글
파이썬(python) 설치 및 파이참(pycharm) 설치 with 윈도우10 (1) | 2021.10.07 |
---|---|
정규표현식(Regular Expression) with 파이썬 . ? + *기호 re.compile(), re.findall(), re.sub() (1) (0) | 2021.09.14 |
자연어처리, 워드임베딩 (Word2Vec, FastText , GloVe 예제)(2) (0) | 2021.09.09 |
자연어처리, 워드임베딩 (Word2Vec, FastText , GloVe 예제)(1) (0) | 2021.09.09 |
딥러닝에서 가중치(W), 편향(Bias)의 역할 (3) | 2021.08.30 |