정규표현식이란?
re 란?
파이썬에서 정규표현식을 사용하기 위한 기본 라이브러리
re 불러오기, 정규표현식 사용해보기
import re
# 정규표현식 규칙 정하기(컴파일,패턴을 돌려준다.)
p = re.compile('ab*')
정규표현식 이용해서 검색하기
re 모듈 내장 함수(Method) | 목적 |
match() | 문자열의 처음부터 정규식과 일치하는지 조사한다. |
search() | 문자열 전체를 검색하여 정규식과 일치하는지 조사한다. |
findall() | 정규식과 일치하는 모든 문자열을 리스트로 돌려준다. |
finditer() | 정규식과 일치하는 모든 문자열을 반복 가능한 객체로 돌려준다. |
match 이용하기
import re
# 문자열 반복과 일치하는 것 선택하는 정규표현식 만들기
p = re.compile('[a-z]+')
m = p.match("python")
print(m)
# 'python'은 다 문자이므로 일치
# <_sre.SRE_Match object at 0x01F3F9F8>
m = p.match("3 python")
print(m)
# '3 python'은 처음에 숫자 3이 오므로 불일치 / None을 돌려줌
# None
search 이용하기
import re
p = re.compile('[a-z]+')
m = p.search("python")
print(m)
# 'python'은 다 문자이므로 일치
# <_sre.SRE_Match object at 0x01F3F9F8>
m = p.match("3 python")
print(m)
# '3 python'은 문자가 들어가므로 일치
# <_sre.SRE_Match object at 0x01F3FA30>
findall 이용하기
import re
p = re.compile('[a-z]+')
result = p.findall("life is too short")
print(result)
# 정규식 조건에 일치하는 모든 문자를, 리스트 형식으로 돌려줌
# ['life', 'is', 'too', 'short']
finditer 이용하기
import re
p = re.compile('[a-z]+')
result = p.finditer("life is too short")
print(result)
# 정규식 조건에 일치하는 모든 문자를, 객체 형식으로 돌려줌
# <callable_iterator object at 0x01F5E390>
for r in result: print(r)
# ...
# <sre.SRE_Match object at 0x01F3F9F8>
# <sre.SRE_Match object at 0x01F3FAD8>
# <sre.SRE_Match object at 0x01F3FAA0>
# <sre.SRE_Match object at 0x01F3F9F8>
간단하게 사용하기
result = re.match('[a-z]+',"python")
match, search의 내장 함수
함수명 | 목적 |
group() | 일치하는 문자열을 돌려준다 |
start() | 일치하는 문자열의 시작 위치를 돌려준다. |
end() | 일치하는 문자열의 끝 위치를 돌려준다. |
span() | 일치하는 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다. |
match에서 내장 함수 이용하기
import re
p = re.compile('[a-z]+')
result = p.match("python")
m.group()
# 'python'
m.start()
# 0
m.end()
# 6
m.span()
(0, 6)
search에서 내장 함수 이용하기
import re
p = re.compile('[a-z]+')
result = p.search("3 python")
m.group()
# 'python'
m.start()
# 2
m.end()
# 8
m.span()
(2, 8)
컴파일 할때 옵션 주기
옵션 | 설명 |
DOTALL(S) | (.) 이 줄바꿈문자도 선택한다 |
IGNORECASE(I) | 대소문자 상관없이 선택한다 |
MULTILINE(M) | ^, $ 과 사용 |
VERBOSE(X) | verbose모드 사용 ( 정규식 간소화 ) |
DOTALL(S) 사용하지 않을 때
import re
p = re.compile('a.b')
# (.)은 기본적으로 \n(줄바꿈) 문자를 인식하지 않는다.
m = p.match("a\nb")
print(m)
# None
DOTALL(S) 사용할 때
import re
p = re.compile('a.b', re.DOTALL)
# p = recompile('a.b', re.S) 도 사용가능
# 이제 (.)이, \n(줄바꿈) 문자를 인식한다
m = p.match("a\nb")
print(m)
# <_sre.SRE_Match object at 0x01FCF3D8>
IGNORECASE(I) 사용하기
import re
p = re.compile('[a-z]', re.I)
# 대소문자 구분하지 않고 선택!
p.match('python')
# <_sre.SRE_Match object at 0x01FCFA30>
p.match('Python')
# <_sre.SRE_Match object at 0x01FCFA68>
p.match('PYTHON')
# <_sre.SRE_Match object at 0x01FCF9F8>
MULTILINE(M) 사용하지 않을 때
import re
p = re.compile('^python\s\w+')
# ^은 문자열 처음을 의미, $는 문자열 마지막을 의미
# ^python은 문자열의 처음이 항상 python으로 시작되어야 선택된다
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data))
# python one
MULTILINE(M) 사용할때
import re
p = re.compile('^python\s\w+', re.M)
# ^은 문자열 처음을 의미, $는 문자열 마지막을 의미
# ^python은 문자열의 처음이 항상 python으로 시작되어야 선택된다
# MULTILINE으로 각 라인마다 따로 정규식을 적용해준다.
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data))
# ['python one', 'python two', 'python three']
VERBOSE(X) 사용해 복잡한 정규식 단순하게 바꾸기
charref = re.compile(r'&[#](0[0-7]+|[0-9]+|x[0-9a-fA-f]+);')
# 보기 어려운 정규식
charref = re.compile(r"""
&[#]
(
0[0-7]+
| [0-9]+
| x[0-9a-fA-F]+ # Hexadeciaml
)
;
""", re.VERBOSE)
# re.VERBOSE가 중간의 공백문자들(whitespace)를 제거해준다 / 보기 쉽게 작성가능
# '#'사용해서 주석도 활용할 수 있다
백슬래시( \ ) 문자열 찾기
"\section" 문자열 찾기위한 정규식 만들기
p = re.compile("\section")
\s는 whitespace로 해석되어 의도한대로 선택이 되지않는다.
[ \t\n\r\f\v]ection
의도한대로 선택하기
# \\ : 문자'\'를 의미함
# 파이썬에선, 함수를 두번 거치므로 \\\\ => \\ => \(최종) 형식으로 변환되어 전달된다.
# 기본형
p = re.compile("\\\\section")
# 축약형
p = re.compile(r"\\section")
반응형