■ 정규표현식: 복잡한 문자열을 특수한 기호들을 사용하여 처리하는 기법
■ 정규표현식 메타문자
※ 메타문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
- 정규표현식에서 사용하는 메타문자들: . ^ $ * + ? { } [ ] \ | ( )
- []
• 문자클래스
• [ ] 사이의 문자들과 매치
• ex) [abc]: "a, b, c 중 한 개의 문자와 매치"
• '-' 하이픈 사용: 두 문자 사이의 범위를 표현
• [a-d] == [abcd], [0-5] == [012345]
• [a-zA-Z]: 알파벳 전체
• [0-9]: 숫자
• ^ 사용: not의 의미를 가지고 있다.
• ex) [^0-9]: 숫자가 아닌 문자
- . (dot)
• '\n'을 제외한 모든 문자 한 개와 매칭된다.
• ex) a.b: a + 모든문자 + b
- *
• 반복을 의미하는 문자이다.
• * 앞에 있는 문자 한 개가 0부터 무한대로 반복될 수 있음을 표현하는 메타문자이다.
- +
•*와는 달리 최소 1번 이상의 반복을 표현할 때 사용한다.
- {m, n}
• {}를 사용하여 반복 횟수를 정할 수 있다.
• 반복횟수 m부터 n까지 설정
• {m}: m번 반복으로 고정
• {m, n}: m ~ n회 반복
- ?
• {0, 1}
• ? 앞의 문자가 없거나 한 개 존재하는 경우
- |
• or의 의미로 사용된다.
• A|B의 경우 A또는 B를 표현한 것이댜.
- ^
• 문자열의 맨 처음과 일치함을 의미한다.
• ^AB: 문자열의 처음이 AB로 시작한다.
• re.M과 함께 사용하는 경우 문자열 전체의 처음이 아닌 각 줄의 처음마다에 적용할 수 있다.
- $
• 문자열의 끝과 매치함을 의미한다.
• re.M과 함께 사용하는 경우 문자열 전체가 아닌 각 줄의 끝과 비교하게 된다.
■ 정규표현식 문자 클래스
- \d: 숫자와 매치, [0-9]와 동일한 표현식이다.
- \D: 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
- \s: whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
- \S: whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
- \w: 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
- \W: 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.
- \A: 문자열의 처음과 매치. ^과는 달리 re.M 옵션에도 각 라인이 아닌 문자열 전체와 비교하게 된다.
- \Z: 문자열의 끝과 매치. $과는 달리 re.M 옵션에도 각 라인이 아닌 문자열 전체의 끝과 비교하게 된다.
- \b: 문자열을 구분하는 공백을 의미한다. ex) '\babc\b'
- \B: \b의 반대. 공백으로 구분되어있지 않는 경우.
■ re 모듈
- 파이썬에서 정규 표현식을 지원해주는 모듈이다.
- compile() 메서드를 사용하여 패턴 객체를 컴파일하여 반환해준다.
import re
p = re.compile('ab*')
■ 정규식을 이용한 문자열 검색
- 컴파일 된 패턴 객체를 사용하여 문자열 검색을 할 수 있다.
import re
# 알파벳 반복을 표현한 패턴 객체를 생성
p = re.compile('[a-z]+')
- match(): 문자열의 처음부터 패턴과 일치하는지 조사하는 메서드
m = p.match("python")
print(m) # <_sre.SRE_Match object at 0x01F3F9F8>
m = p.match("3 python")
print(m) # None
# 패턴과 일치하는 경우 match 객체를 일치하지 않는 경우에는 None을 반환한다.
- search(): 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
m = p.search("3 python")
print(m) # <_sre.SRE_Match object at 0x01F3FA30>
# match()와 달리 처음부터 일치하는지가 아닌 전체 문자열 중에 일치하는 부분이 있는 경우 match() 객체를 반환한다.
- findall(): 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다.
result = p.findall("life is too short")
print(result) # ['life', 'is', 'too', 'short']
- finditer(): 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다.
• findall()과 달리 리스트가 아닌 iterator로 반환
• 각각의 객체는 match 객체이다.
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>
'''
■ match 객체
- group(): 매치된 문자열을 돌려준다.
- start(): 매치된 문자열의 시작 위치를 돌려준다.
- end(): 매치된 문자열의 끝 위치를 돌려준다.
- span(): 매치된 문자열의 (시작, 끝) 위치를 돌려준다.
m = p.match("python")
m.group() # 'python'
m.start() # 0
m.end() # 6
m.span() # (0, 6)
■ 컴파일 옵션
- DOTALL(re.S): . 이 줄바꿈 문자(\n)를 포함하여 모든 문자와 매치할 수 있도록 한다.
- IGNORECASE(re.I): 대소문자에 관계없이 매치할 수 있도록 한다.
- MULTILINE(re.M): 여러줄과 매치할 수 있도록 한다. (^, $ 메타문자의 사용과 관계가 있는 옵션이다)
- VERBOSE(X): verbose 모드를 사용할 수 있도록 한다. (정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)
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)
# VERBOSE 옵션을 사용하여 공백 및 주석을 정규표현식 내부에 사용할 수 있다.
■ 백슬래시
- 문자 클래스의 '\'와 실제 문자 '\'의 혼용으로 오류발생
- 백슬래시를 문자 클래스가 아닌 실제 문자로 사용하기 위해서는 \\와 같이 백슬래시 앞에 백슬래시를 하나 더 추가해준다.
- raw string: 컴파일하는 정규표현식이 문자 클래스가 사용된 것이 아닌 raw string임을 알려주는 방법이다.
# 컴파일하는 문자열 앞에 r을 붙여서 raw string임을 알려준다.
p = re.compile(r'\\section')
■ 그루핑
- 낱개 문자가 아닌 문자열의 반복 및 패턴의 정규표현식을 만들기 위해서 그루핑을 사용한다.
- ( )를 사용하여 그루핑한다.
p = re.compile('(ABC)+')
m = p.search('ABCABCABC OK?')
print(m) # <re.Match object; span=(0, 9), match='ABCABCABC'>
print(m.group()) # ABCABCABC
- group 인덱스 사용
• group(0)매치된 전체 문자열
• group(1)첫 번째 그룹에 해당되는 문자열
• group(2)두 번째 그룹에 해당되는 문자열
• group(n)n 번째 그룹에 해당되는 문자열
'프로그래밍언어 > Python' 카테고리의 다른 글
[Python] 프로젝트 패키징 & 배포 (0) | 2021.04.01 |
---|---|
[Python] 객체 LifeCycle과 Garbage Collection (Reference Counts) (0) | 2021.03.26 |
ch05. 파이썬 날개달기 (내장함수, 라이브러리) (0) | 2021.03.06 |
ch05. 파이썬 날개달기 (패키지, 예외처리) (0) | 2021.03.01 |
ch05. 파이썬 날개달기 (모듈) (0) | 2021.02.28 |