파이썬에서 정규 표현식을 지원하는 re 모듈
import re
p = re.compile('ab*')
- re.compile을 사용하여 정규표현식을 컴파일
- re.compile의 결과로 돌려주는 객체 p(컴파일된 객체)를 사용하여 그 이후 작업 수행
정규식을 이용한 문자열 검색
match( ) | 문자열의 처음부터 정규식(정규표현식)과 매치되는지 조사 |
search( ) | 문자열 전체를 검색하여 정규식과 매치되는지 조사 |
findall( ) | 정규식과 매치되는 모든 문자열을 리스트로 반환 |
finditer( ) | 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 반환 |
match( )와 search( )는 정규식과 매치될 때는 match 객체 반환, 매치되지 않을 때는 None 반환
import re
p = re.compile('[a-z]+')
match
문자열의 처음부터 정규식(정규표현식)과 매치되는지 조사
문자열 'python'은 [a-z]+ 정규식에 부합되므로 match 객체를 반환
m = p.match("python")
print(m)
>> match 객체 반환
search
문자열 전체를 검색하여 정규식과 매치되는지 조사
m = p.search("python")
print(m)
>> 객체 반환
m = p.serach("3 python")
print(m)
>> 3 이후의 python 문자열과 매치
findall
정규식과 매치되는 모든 문자열을 리스트로 반환
result = p.findall("life is too short")
print(result)
>> ['life', 'is', 'too', 'short']
finditer
정규식과 매치되는 모든 문자열을 반복 가능한 객체로 반환
>>> result = p.finditer("life is too short")
>>> print(result)
<callable_iterator object at 0x01F5E390>
>>> for r in result: print(r)
...
<re.Match object; span=(0, 4), match='life'>
<re.Match object; span=(5, 7), match='is'>
<re.Match object; span=(8, 11), match='too'>
<re.Match object; span=(12, 17), match='short'>
match 객체의 메서드
method | 목적 |
group( ) | 매치된 문자열을 반환 |
start( ) | 매치된 문자열의 시작 위치 반환 |
end( ) | 매치된 문자열의 끝 위치 반환 |
span( ) | 매치된 묹열의 (시작, 끝)에 해당하는 튜플 반환 |
match 메서드와 search 메서드의 start 차이
(match는 무조건 0, search는 start 값이 다르게 나올 수 있음)
>>> m = p.match("python")
>>> m.group()
'python'
>>> m.start()
0
>>> m.end()
6
>>> m.span()
(0, 6)
>>> m = p.search("3 python")
>>> m.group()
'python'
>>> m.start()
2
>>> m.end()
8
>>> m.span()
(2, 8)
re.compile을 사용하여 컴파일된 패턴 객체로 이후의 작업 수행
re.match로 코드를 축약할 수 있음
(한 번 만든 패턴 객체를 여러번 사용해야할 때는 re.compile 사용이 편리함)
컴파일 옵션
DOTALL(S) | . 이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 함 |
IGNORECASE(I) | 대소문자에 관계없이 매치할 수 있도록 함 |
MULTILINE(M) | 여러줄과 매치할 수 있도록 함 ( ^, $ 메타문자의 사용과 관계가 있는 옵션) |
VERBOSE(X) | verbose모드를 사용할 수 있도록 함 (정규식을 보기 편하게) |
DOTALL, S
. 메타 문자는 줄바꿈 문자(\n)를 제외한 모든 문자와 매치되는 규칙임
만약 \n 문자도 포함하여 매치하고 싶다면 re.DOTALL 또는 re.S 옵션을 사용해 컴파일 하면 됨
보통 re.DOTALL 옵션은 여러 줄로 이루어진 문자열에서 \n에 상관없이 검색할 때 사용
import re
p = re.compile('a.b')
m = p.match('a\nb')
print(m)
>> None
p = re.compile('a.b', re.DOTALL)
m = p.match('a\nb')
print(m)
>> \n과 상관없이 객체 반환
IGNORECASE, I
대소문자 구별 없이 매치를 수행할 때 사용하는 옵션
p = re.compile('[a-z]+', re.I)
p.match('python')
>> 객체 반환
p.match('PYTHON')
>> 객체 반환
MULTILINE, M
^ : 문자열의 처음을 의미 (^python - 문자열의 처음은 항상 python으로 시작)
$ : 문자열의 마지막을 의미 (python$ - 문자열의 마지막은 항상 python으로 끝나야함)
import re
p = re.compile("^python\s\w+")
# python이라는 문자열로 시작하고
# 그 뒤에 whitespace
# 그 뒤에 단어가 와야함을 의미
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data))
>> ['python one']
^ 메타 문자에 의해 python이라는 문자열을 사용한 첫 번째 줄만 매치
re.MULTILINE 또는 re.M을 이용하여 각 라인의 처음으로 인식시키고 싶을 때 사용
^, $ 메타 문자를 문자열의 각 줄마다 적용해줌
import re
p = re.compile("^python\s\w+", re.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"""
&[#] # Start of a numeric entity reference
(
0[0-7]+ # Octal form
| [0-9]+ # Decimal form
| x[0-9a-fA-F]+ # Hexadecimal form
)
; # Trailing semicolon
""", re.VERBOSE)
re.VERBOSE 옵션을 사용하면 문자열에 사용된 whitespace는 컴파일할 때 제거됨 ([ ] 안에 사용한 whitespace는 제외)
줄 단위로 #기호를 사용하여 주석문을 작성할 수 있음
백슬래시 문제
문자열 앞에 r문자 삽입하여 Raw String 규칙으로 인해 \ 2개 대신 1개만 써도 2개를 쓴것과 같은 동일한 의미를 가짐
p = re.compile(r'\\section')
참고
https://wikidocs.net/4308#match
07-2 정규 표현식 시작하기
[TOC] ## 정규 표현식의 기초, 메타 문자 정규 표현식에서 사용하는 메타 문자(meta characters)에는 다음과 같은 것이 있다. > ※ 메타 문자란 원래 ...
wikidocs.net
'Programming > Python' 카테고리의 다른 글
[Python] 정규표현식(Regular Expressions)(1) (0) | 2022.06.03 |
---|---|
[Python] 유니코드 활용하여 문자열을 숫자로 변환하기 (0) | 2022.04.01 |
[Python] set(집합) 자료형 정리 (0) | 2022.03.20 |
[Python] 2차원 배열(리스트) 초기화, 입력 받기 (0) | 2022.03.17 |