복잡한 문자열을 처리하기 위해 사용하는 기법인 정규 표현식!
문자열 매칭을 위한 여러 메타 문자들을 배워보자
메타 문자
: 원래의 뜻이 아닌 특별한 의미를 가진 정규 표현식의 문자
. ^ $ * + ? { } [ ] \ | ( )
문자 클래스 [ ]
: 괄호 사이의 문자들과 매치
- [abc] = [a-c] : a, b, c 중 한개의 문자와 매치를 확인
- [012345] = [0-5] : 0부터 5까지의 숫자가 포함되었는지 확인
- [^0-9] : ^는 not의 의미 / 숫자가 아닌 문자만 매칭
.(dot) 문자
: \n(줄바꿈 문자) 을 제외한 모든 문자와 매치
- a.b : a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치
- a[.]b : 여기서 .(dot)은 메타문자가 아닌 "." 문자 그대로를 의미
* 문자
: 반복을 의미하는 * 메타 문자 사용 / * 바로 앞에 문자가 0개부터 무한대까지 반복 가능
ex) 정규식 : ca*t / 문자열 : ct -> * 앞에 있는 a가 0개 반복 -> 정규식 매치 (앞의 문자가 없는 경우에도 매치)
+ 문자
: 1회 이상 반복을 의미하는 + 메타 문자 사용 / + 바로 앞에 문자가 1개부터 무한대까지 반복 가능
ex) 정규식 : ca+t / 문자열 : ct -> + 앞에 있는 a가 0개 반복 -> 정규식 매치X (앞의 문자가 최소 1개)
{ } 정규식
: 반복 횟수를 고정하여 매치 {m, n} -> 반복횟수 m~n (생략하면 양 끝 - 무한대 또는 0)
--> {1 , } = +문자 / {0 , } = *문자
ex) ca{2,5}t : cat -> c,t를 양끝에 가지고, a를 2~5회 반복하는 문자와 매치됨
? 정규식
: 앞의 문자가 있거나 없거나 매치
ex) ab?c : abc -> b가 1번 사용되어 매치 (0번이여도 매치)
--------------------------------------------------------------------------
정규식을 지원하는 파이썬 모듈 : re(regular expression)
: 컴파일된 패턴 객체를 사용하여 문자열 검색을 수행
-> match, search는 정규식과 매치될 때는 match 객체를 리턴하고 매치되지 않을 때는 None을 리턴.
전체가 완벽히 매칭되는지 : match()
: match 메서드는 문자열의 처음부터 정규식과 매치되는지 조사
import re
p = re.compile('[a-z]+')
m = p.match("python")
print(m)
# <re.Match object; span=(0, 6), match='python'>
일부라도 매칭되는지 : search()
: search 메서드는 문자열 내 매칭되는 문자가 있는지를 조사
p = re.compile('[a-z]+')
m = p.search("3 python")
print(m)
# <re.Match object; span=(2, 8), match='python'>
매칭되는 값을 리스트로 반환 : findall()
: findall은 패턴([a-z]+)과 매치되는 모든 값을 찾아 리스트로 리턴한다.
result = p.findall("life is too short")
print(result)
# ['life', 'is', 'too', 'short']
매칭되는 값을 match object로 반환: finditer()
: finditer는 findall과 동일하지만, 그 결과로 반복 가능한 객체(iterator object, match object)를 리턴
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'>
--------------------------------------------------------------------------
컴파일 할때 특수한 방법들을 설정 : 컴파일 옵션
: p = re.compile("<정규식>", <컴파일옵션>)
ex) p = re.compile('a.b', re.DOTALL)
옵션 | 설명 |
DOTALL(S) | .(dot)이 모든 문자와 매칭 |
IGNORECASE(I) | 대소문자 관계없이 매칭 |
MULTILINE(M) | 여러 줄과 매칭 |
VERBOSE(X) | verbose 모드(코드 구조 변경, 주석 사용) |
dot은 모든 것! : DOTALL(S)
: 줄바꿈 문자(\n)도 포함하여 매치 (원래는 줄바꿈 문자는 제외)
p = re.compile('a.b', re.DOTALL)
m = p.match('a\nb')
print(m)
# <re.Match object; span=(0, 3), match='a\nb'>
대소문자는 구분하지 않겠다 : IGNORECASE(S)
p = re.compile('[a-z]+', re.I)
p.match('Python')
# <re.Match object; span=(0, 6), match='PYTHON'>
여러줄에서 각 줄 매치 : MULTILINE(M)
: 여러 줄로 이루어진 문자열에서 각 줄의 처음과 끝 문자를 매치
메타문자 ^ | ^은 문자열의 처음을 의미 ex) ^python: 문자열이 python으로 끝나는 지 |
메타문자 $ | $은 문자열의 마지막을 의미 ex) python$ : 문자열이 python으로 끝나는 지 |
# multiline.py
import re
p = re.compile("^python\s\w+", re.MULTILINE)
정규식 주석처리 : VERBOSE(X)
: 어려운 정규식을 주석 또는 줄 단위로 구분하여 볼수 있도록 하는 기능
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)
08-2 정규 표현식 시작하기
정규 표현식에서는 메타 문자(meta characters)를 사용한다. 먼저 메타 문자가 무엇인지 알아보자. [TOC] ## 정규 표현식의 기초, 메타 문자 메타 문자란 원…
wikidocs.net
'프로그래밍 > for AI' 카테고리의 다른 글
[Data] pandas 핵심 기능 정리 (1) | 2025.02.10 |
---|---|
[Utils] github 기본 사용법 정리(feat.TIL) (1) | 2025.02.10 |
[Data] numpy 핵심 기능 정리 (1) | 2025.02.06 |
[DL] 딥러닝 기초개념 정리 (0) | 2025.02.05 |
[ML] 마스터 알고리즘(책) -페드로 도밍고스 (4) | 2025.02.05 |