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로 시작, b가 1개 이상 붙어있는 패턴
- 메소드
- match() : 문자열의 처음부터 패턴과 매칭되는지 확인
- match()로 생성되는 결과물은 Match라는 클래스의 객체
- group() : 매칭된 문자열 반환
- start() : 매칭된 문자열 시작 위치 반환
- end() : 매칭된 문자열 끝 위치 반환
- span() : 매칭된 문자열 (시작, 끝) 위치에 해당하는 튜플 반환
- search() : 문자열 전체를 탐색해 정규식과 매칭되는지 확인
- 중간에라도 있으면 있다고 반환
- findall() : 정규식과 매칭되는 모든 문자열 반환
- [‘ab’, ‘ab’, ‘abc’] <- 이렇게
- finditer() : 매칭되는 문자열을 반복가능한 객체(iterator)로 반환
- 반복문 돌려서 사용하고 한 번 순환 돌리면 다시 재선언 해야됨.
- sub() : 정규식과 매칭되는 모든 문자열을 다른 문자열로 수정
- p.sub(‘xx’, my_str1) <- 이렇게 사용
- match() : 문자열의 처음부터 패턴과 매칭되는지 확인
- re.compile()의 옵션
- re.DOTALL, re.S : 모든 문자와 매칭
- p = re.compile(‘a.b’, re.DOTALL) -> 줄바꿈문자 포함 임의의 문자가 들어간 패턴 매칭
- re.IGNORECASE, re.l : 대소문자 구별없이 매칭
- p = re.compile(‘a.b’, re.l)
- 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 + s가 1~3개 + ion
- re.compile(‘(na){3}’) : na가 3번 반복
- re.compile(‘talk|walk’) : talk or walk와 매칭
- re.compile(‘^a’) : a로 시작하는 문자열 매칭(대괄호 안에 ^를 적으면 제외하라는 의미)
- re.compile(‘[yY]eah$’) : yeah로 끝나는 문자열 매칭
- re.DOTALL, re.S : 모든 문자와 매칭
정규표현식의 전방, 후방, 부정 탐색
정규표현식은 앞에서부터 결과를 반환함
패턴과 매칭되는 가장 긴 결과물을 반환 -> 한 어절(띄어쓰기) 안에 있을 때
- 예시 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 |