본문 바로가기
NLP

[NLP] 정규 표현식, Regular Expression

by 단깅수 2024. 7. 1.
728x90

What is Regular Expression?

  • 특정한 문자의 패턴을 정의하는 방식
    • 특정한 규칙을 가진 문자열 탐색
    • 이메일 주소만 추출 (XXX@XXX.XXX)
    • 전화번호만 추출 ((XXX)-XXX-XXXX)

자주 쓰이는 정규표현식 문법

예시 설명
[abcde] 문자클래스 : []
대괄호 안에 있는 문자들과 매치하라는 의미

여러 개의 대괄호도 사용 가능
문자열에서 
a, b, c, d, e와 매칭되는 부분 탐색
[a-e] 하이픈(-)을 써서 범위 지정도 가능
문자열에서 a, b, c, d, e와 매칭되는 부분 탐색

메타 문자 : 원래 의미가 아닌 다른 용도로 사용되는 문자
*, +, ?, {n}, {m, n} 등등
“da.ce” Dot(.) : 줄바꿈 문자를 제외한 모든 문자와 매칭 (공백 포함)
dance(O), damce(O), dace(X)
 “dan*ce” 반복(*) : 0번 이상 반복된 모든 문자와 매칭
dance(O), dannnce(O), dace(O)
“dan+ce” 반복(+) : 1번 이상 반복된 모든 문자와 매칭
dance(O), dannnce(O), dace(X)
“dan{1, 3}ce” 반복({m, n}) : m번 이상 n번 이하 반복된 모든 문자와 매칭
dance(O), dace(X)
“dan{1}ce” 반복({m}) : 정확히 m번 반복해 사용된 모든 문자와 매칭
dance(O), dannnce(X), dace(X)
“dan{1,}ce” 반복({m,}) : m번 이상 반복해 사용된 모든 문자외 매칭
dance(O), dannnce(O), dace(X)
“dan{?}ce” 반복(?) : 0번 or 1번 반복해 사용된 모든 문자와 매칭
dance(O), dannnce(X), dace(O)
“to(ma|pa){1, 3}to” 소괄호() : 여러 개 문자의 패턴 생성 가능
to로 시작하고 ma or pa가 1~3번 반 복되고 to로 끝나는 문자
“\((0-9){1, 3}\)-(0-9){3, 4}-(0-9){3, 4}”
역슬래시(\) : 원래 의미로 전달

 

(연습문제)

  • http로 시작하고 .zip으로 끝나는 패턴
    • (http).+(\.zip)
  • http로 시작하고 dot이 한 개 이상 있으며 중간에 2000 ~ 2009와 매칭되도록 하는 패턴
    • (http)(.+)200[0-9](.+)(\.zip)
  • http로 시작하고 dot이 한 개 이상 있으며 중간에 1900 ~ 1999와 매칭되도록 하는 패턴
    • (http)(.+)\/(19[0-9]{2})\/(\.zip)

 

파이썬에서 정규표현식 활용하기

  • 모듈 : import re
  • 패턴 생성 : re.complie()
    • ex) re.compile(‘ab+’) : a로 시작, b1개 이상 붙어있는 패턴
  • 메소드
    1. match() : 문자열의 처음부터 패턴과 매칭되는지 확인
      • match()로 생성되는 결과물은 Match라는 클래스의 객체
      • group() : 매칭된 문자열 반환
      • start() : 매칭된 문자열 시작 위치 반환
      • end() : 매칭된 문자열 끝 위치 반환
      • span() : 매칭된 문자열 (시작, ) 위치에 해당하는 튜플 반환
    2. search() : 문자열 전체를 탐색해 정규식과 매칭되는지 확인
      • 중간에라도 있으면 있다고 반환
    3. findall() : 정규식과 매칭되는 모든 문자열 반환
      • [‘ab’, ‘ab’, ‘abc’] <- 이렇게
    4. finditer() : 매칭되는 문자열을 반복가능한 객체(iterator)로 반환
      • 반복문 돌려서 사용하고 한 번 순환 돌리면 다시 재선언 해야됨.
    5. sub() : 정규식과 매칭되는 모든 문자열을 다른 문자열로 수정
      • p.sub(‘xx’, my_str1) <- 이렇게 사용
  • re.compile()의 옵션
    1. re.DOTALL, re.S : 모든 문자와 매칭
      • p = re.compile(‘a.b’, re.DOTALL) -> 줄바꿈문자 포함 임의의 문자가 들어간 패턴 매칭
    2. re.IGNORECASE, re.l : 대소문자 구별없이 매칭
      • p = re.compile(‘a.b’, re.l)
    3. re.MULTILINE, re.M : 문자열 각 라인마다 매칭
      • p = re.compile(‘python \n+’, re.M) -> line마다 python 임의의 숫자 or 문자와 매칭
      • re.compile(‘[a-zA-Z]alk’) : 임의의 알파벳으로 시작 후 alk
      • re.compile(‘permis{1, 3}ion’) : permi + s1~3+ ion
      • re.compile(‘(na){3}’) : na3번 반복
      • re.compile(‘talk|walk’) : talk or walk와 매칭
      • re.compile(‘^a’) : a로 시작하는 문자열 매칭(대괄호 안에 ^를 적으면 제외하라는 의미)
      • re.compile(‘[yY]eah$’) : yeah로 끝나는 문자열 매칭

정규표현식의 전방, 후방, 부정 탐색

정규표현식은 앞에서부터 결과를 반환함

패턴과 매칭되는 가장 긴 결과물을 반환 -> 한 어절(띄어쓰기) 안에 있을 때

 

  • 예시 1
    • [a-zA-Z0-9]ef[a-zA-Z0-9]
    • AB12efC1efGH ==> 2efC 제거
    • efGH 만 남아서 매칭 안되고 앞에만 매칭
    • span(3,7)
    • match = ‘2efC’
  • 예시 2
    • [a-zA-Z0-9]+ef[a-zA-Z0-9]
    • AB 12efgh likeflmefo ==> 12efg 매칭
    • likeflmefo 매칭
    • 어절 단위로 앞에서부터, 가장 긴 결과물 반환

(?)을 활용한 정규표현식 – 시작점으로 | 커서 옮기기

보통 전방이랑 앞 문자 / 후방이랑 뒤 문자가 매칭이 많이 됨

ex) KuJunHoe

(?=Jun) : Ku | JunHoe (전방)

.(?=Jun) : KuJunHoe

(?=Jun). : KuJunHoe

 

(?<=Jun) : KuJun | Hoe (후방)

.(?<=Jun) : KuJunHoe

(?<=Jun). : KuJunHoe

 

.(?!Jun) : K, J, u, n, H, o, e (부정)

.(?<!Jun) : K, u, J, u, H, o, e

 

http 만 뽑기 --> p = re..compile('.+(?=:)')

가격만 뽑기 --> p = re.compile('(?<=\$)[0-9]+.[0-9]*')

제목뽑기 --> p = re.compile('(?<=\<title\>).+(?=\<\/title\>)')

후방탐색 --> p = re.compile(‘(?<=\.).+’)

 

## my_str : 대사와 지문이 섞여있는 문자열
## 정규표현식을 활용해 인물만 추출

## 문자열
my_str= '''Chandler: All right Joey, be nice. So does he have a hump? A hump and a hair-
piece? Phoebe: Wiat, does he eat chalk? Phoebe: Just, because, I do not want her 
to go through what I went through with Carl- oh!'''

ans = []
pattern3 = re.compile('[a-zA-Z]+:')
ans = pattern3.findall(my_str)
ans3=[]
for i in ans:
    ans3.append(i[:-1])
ans3 = list(set(ans3))
ans3

 

728x90

'NLP' 카테고리의 다른 글

[NLP] Similarity, 문서 유사도 측정  (0) 2024.07.06
[NLP] Text Data Preprocessing  (0) 2024.07.02
[NLP] API를 활용한 Web Crawling  (0) 2024.06.29
[NLP] Web Crawling, Selenium  (0) 2024.06.28
[NLP] Web Scraping, BeautifulSoup  (0) 2024.06.27