정규표현식의 문법과 파이썬에서 활용하는 법을 작성했습니다.
(표현 앞에는 🍎를 붙여서 구분되게 작성했습니다.)
🔗 정규표현식이란?
특정한 문자의 패턴을 정의하는 방식.
📌 메타문자
메타문자란 정규표현식을 위해 원래 의미가 아닌 다른 용도로 사용되는 문자.
dot(.)
🍎 . : 다빈치코드에서 조커같은 느낌. 줄바꿈문자(\n) 제외하고 아무거나 와도 된다.
- da.ce : dance, damce 등등 매칭. 단, dace는 매칭 X.
반복
🍎 * : 0번 이상 반복된 모든 문자와 매칭, 스페이스바도 하나의 문자임!
- dan*ce - dace, dance, dannnce 매칭됨
- p = re.compile('ab*') - a로 시작하며 그 뒤에 b가 0개 이상 붙어있는 패턴.
🍎 + : 1번 이상 반복된 모든 문자와 매칭
- dan+ce : dance, dannce 등
🍎 {m,n} : m 이상 n 이하로 반복된 모든 문자와 매칭
- dan{1,3}ce : n이 1~3번 반복되어야 매칭
🍎 {m} : 정확히 m번 반복
🍎 {m,} : m번 이상 반복
🍎 ? : 0 or 1번 반복
- dan?ce : dance, dace 매칭됨
SWITH
🍎 STARTSWITH (^) : 문자열 시작
🍎 ENDSWITH ($) : 문자열 끝
p = re.compile('^[aA]nd [a-zA-Z]+', re.M)
# 문자열 시작이 대소문자 a로 시작하고 뒤에 nd, 그 뒤에 한 칸 띄고 영어 대소문자가 1개 이상 있는 문자열과 매칭, 각 라인에서 매칭
# And to, And the, 등
📌 기초문법
대괄호 []
[abc] : a, b, c 중 하나와 매칭
[^abc] : a, b, c를 제외한 모든 문자 중 하나와 매칭
[dn]a : 앞이 d or n, 그 다음이 a인 것과 매칭
[a-eA-E] : 소문자 a부터 e까지, 대문자 A부터 E까지
소괄호 () - 패턴그룹화
소괄호로 여러 개 문자로 이뤄진 패턴 생성 가능
(abc) : abc 매칭
- to(ma|pa){1,3}to : to로 시작, 중간에 ma 또는 pa가 1번 이상 3번 이하 반복되고, to로 끝나는 문자와 매칭, tomato, tomamato, tomapato 등등
역슬래시
문자열에서 이스케이프 시퀀스의 시작을 알려주는 역할
- \n 줄바꿈, \t 현재시간 등
메타문자 앞에 '\' 붙여줘야 원래 의미로 쓰임
- 괄호 쓰고 싶으면 앞에 \ 붙여줘서 괄호를 문자로 인식하도록.
- ex. (xxx)xxx-xxxx의 형식인 전화번호 추출하기 : \([0-9]{2,3}\)[0-9]{3)-[0-9]{4}
예제: 특허 링크 추출하기
1. 모든 특허 링크 추출하기, http로 시작하고 .zip으로 끝나는 텍스트와 매칭되도록
- http.*\.zip : *가 반복 허용이니까 .(암거나)가 여러 번 와도 된다는 뜻, .zip의 .를 문자로 인식하도록 앞에 역슬래시 붙여줌
2. 2000년대 특허 링크 추출하기, http로 시작하고 .zip으로 끝나면서 주소의 가운데 일부가 2000~2009와 매칭되도록
- http.*200[0-9].*\.zip
3. 2000년 이전 특허 링크 추출하기, http로 시작하고 .zip으로 끝나면서 주소의 가운데 일부가 1900년대와 매칭되도록
- http:*\/19[0-9]*\/.*zip : 년도 앞 슬래시까지 매칭
🔗 Python에서 정규표현식 활용
import re
# 패턴 생성하기
p = re.compile('ab+') # Pattern 클래스의 객체임.
Pattern 객체의 메서드
- match() : 문자열 처음부터 매칭되는지 확인. 시작부분이 매칭되어야 함!
- search() : 문자열 전체 탐색해 매칭되는지 확인
- findall() : 매칭되는 모든 문자열 반환
- finditer() : 매칭되는 모든 문자열 iterator(반복가능객체) 형태로 반환
- sub() : 매칭되는 모든 문자열 다른 문자열로 수정
p = re.compile('^python \w+')
# ^ : 문자열이 주어진 패턴으로 시작할 때 매칭
# \w : 문자 + 숫자와 매칭. == [a-zA-Z0-9]
# + : 1개 이상 존재
# 즉, python으로 시작하며 한 칸 띄고 아무 문자나 1개 이상 존재하는 문자열과 매칭
# 예를 들어 'python one'
패턴 생성 시 옵션 사용
- re.DOTALL : 개행 문자를 포함한 모든 문자와 매칭
- re.l : 대소문자 구별 없이 매칭
- re.M : 문자열 각 라인마다 매칭
p = re.compile('a.b', re.DOTALL) # a\nb도 매칭됨! (줄바꿈문자 \n도 ok)
💡 헷갈리는 개념 복습
대괄호 [abc] : abc 문자 중 하나
중괄호 ap{2,3}le : 반복, apple, appple
소괄호 (abc) : abc 매칭
전방탐색
문자열 전방부터 탐색하는 방식
- 긍정형 전방탐색
🍎 (?=문자)
= 뒤의 문자와 일치하는 텍스트를 전방부터 탐색
문자는 검색 조건으로 사용되나 결과에는 포함 XXX
# http://www.naver.com, ftp://000.000.000.000 등에서 colon(:) 앞 부분 추출하기
p = re.compile('.+(?=:)')
tmp_str = 'http://www.naver.com'
result = p.search(tmp_str)
print(result) # <re.Match object; span=(0, 4), match='http'>
- 부정형 전방탐색
🍎 (?!문자)
! 뒤의 문자와 일치하지 않는 텍스트를 전방부터 탐색
문자는 검색 조건으로 사용되나 결과에는 포함 XXX
# 확장자가 bar이거나 exe인 파일 제외하고 추출하기
tmp_str = """
foo.bar
autoexec.bat
sendmail.cf
autorun.exe
"""
p = re.compile('.*[.](?!bar|exe).*$', re,M)
results = p.finditer(tmp_str)
for result in results:
print(result)
# <re.Match object; span=(9, 21), match='autoexec.bat'>
# <re.Match object; span=(22, 33), match='sendmail.cf'>
후방탐색
문자열 후방부터 탐색
- 긍정형 후방탐색
🍎 (?<=문자)
- 부정형 후방탐색
🍎 (?<!문자)
출처 및 참고자료 : 2023-1 국민대학교 AI빅데이터융합경영학과 텍스트데이터분석 교과목
본 포스팅은 필자가 2023.07.21 github blog에 업로드한 글을 가져왔습니다.