Regular Expression
정규 표현식
* Module re (Regular Expression Operations) (URL)
- 정규 표현식은 임포트 할 수 있는 표준 모듈 re로 제공한다.
- 원하는 문자열 패턴을 정의하여, 소스 문자열과의 일치 여부를 판단한다.
# 일반형
import re
re.match(pattern, source)
# 패턴 확인을 빠르게 하기 위해, 패턴을 먼저 컴파일하는 방법
import re
A = re.compile(pattern)
B = A.match(source)
# 사용 예시 (1)
result = re.match('You', 'Young Frankenstein')
# 'You'는 패턴, 'Young Frankenstein'은 확인하고자 하는 문자열 소스
# 사용 예시 (2)
youpattern = re.compile('You')
result = youpattern.match('Young Frankenstein')
Special Characters (특수 문자)
Special Character | Description |
. | - newline을 제외한 모든 문자에 매칭된다. - DOTALL Flag가 설정되면, newline문자를 포함한 모든 문자에 매칭된다. |
^ | - 문자열의 시작부분에 매칭된다. - MULTILINE Flag가 설정되면, 각각의 newline에서의 문자열 시작부분에 매칭된다. |
$ | - 문자열의 끝부분 또는 newline 바로 이전 부분에 매칭된다. - MULTILINE Flag가 설정되면, newline 바로 이전 부분에 매칭된다. |
* | - 0개 이상의 반복되는 부분에 매칭된다. |
+ | - 1개 이상의 반복되는 부분에 매칭된다. |
? | - 0회 또는 1회 반복되는 부분에 매칭된다. |
*? +? ?? |
- 가능한한, 많은 문자에 매칭된다. (Greedy) |
{m} | - 정확히 m회 반복되는 부분에 매칭된다. |
{m, n} | - m회 이상, n회 이하 반복되는 부분에 매칭되는데, 가능한한 많은 횟수의 반복에 우선적으로 매칭된다. (Greedy) |
{m, n}? | - m회 이상, n회 이하 반복되는 부분에 매칭되는데, 가능한한 적은 횟수의 반복에 우선적으로 매칭된다. (Non-Greedy) |
\ | - Escape Special Sequence를 표현하고자 하는 경우, \를 앞에 붙인다. - Escape Special Sequence는 '*' 문자, '?' 문자와 같이, re 모듈에서 특수 기능으로 사용되는 문자를 의미한다. |
[<char-set>] | - 1개 이상의 문자로 구성된 <char-set>의 각각의 문자에 매칭된다. ex) [amk]의 경우, 문자 'a' 또는 'm' 또는 'k'에 매칭된다. |
[<start>-<end>] | - <start> 문자 이상, <end> 문자 이하의 문자에 매칭된다. ex) [a-z]의 경우, 영문 소문자 1글자('a'~'z')에 매칭된다. ex) [0-9]의 경우, 숫자 1글자('0'~'9')에 매칭된다. (10진법수) ex) [0-5][0-9]의 경우, '00'에서 '59'에 매칭된다. (60진법수) ex) [0-9A-Fa-f]의 경우, '0'에서 'F'('f')에 매칭된다. (16진수) |
[<escape-special-sequence>] | - Escape Special Sequence는 대괄호([ ]) 내에서는 기능이 상실된다. - 대괄호([ ])내에서 '[' 를 표현하고자 하는 경우, 그냥 '['를 기술하면 된다. - 대괄호([ ])내에서 ']' 를 표현하고자 하는 경우, '\]' 또는 ']'를 대괄호([ ])내에서 가장 앞에 위치시킨다. ex) [(+*)]는 Literal Character '(', '+', '*', ')' 에 매칭된다. ex) [()[\]{}]는 '(', ')', '[', ']', '{', '}'에 매칭된다. ex) []()[{}]는 '(', ')', '[', ']', '{', '}'에 매칭된다. |
[^<char>] | - <char> 문자를 제외한 모든 문자에 매칭된다. (Complementing; 여집합) |
<re1>|<re2> | - 정규 표현식 <re1> 또는 정규 표현식 <re2>에 매칭된다. - <re1>의 매칭을 먼저 탐색한다. - <re1>과 <re2>에 모두 매칭될 경우, <re1>에 대한 매칭결과만 반환된다. (Non-Greedy) |
(...) | - 소괄호(( ))내에 위치하는 정규 표현식에 매칭된다. - 소괄호(( )) 표현식의 결과는 \number Sequence를 통해 각각의 결과에 접근할 수 있다. - '('를 표현하고자 하는 경우, \(로 표현하거나 [(]로 표현한다. - ')'를 표현하고자 하는 경우, \)로 표현하거나 [)]로 표현한다. |
(?...) | |
(?aiLmsux) | |
(?:...) | |
(?aiLmsux-imsx:...) | |
(?P<name>...) | |
(?P=name) | |
(?#...) | |
(?=...) | |
(?!...) | |
(?<=...) | |
(?<!...) | |
(?(id/name)yes-pattern|no-pattern) |
Special Sequences (특수 시퀀스)
Special Sequence | Description |
\number | |
\A | |
\b | |
\B | |
\d | |
\D | |
\s | |
\S | |
\w | |
\W | |
\Z | |
\u | |
\U | |
\N | |
\N{name} |
re Module Flags
Flag | Description |
re.A | |
re.ASCII | |
re.DEBUG | |
re.I | |
re.IGNORECASE | |
re.L | |
re.LOCALE | |
re.M | |
re.MULTILINE | |
re.S | |
re.DOTALL | |
re.X | |
re.VERBOSE |
re Module Functions
Function | Description |
re.compile(pattern, flags=0) | |
re.search(pattern, string, flags=0) | |
re.match(pattern, string, flags=0) | |
re.fullmatch(pattern, string, flags=0) | |
re.split(pattern, string, maxsplit=0, flags=0) | |
re.findall(pattern, string, flags=0) | |
re.finditer(pattern, string, flags=0) | |
re.sub(pattern, repl, string, count=0, flags=0) | |
re.subn(pattern, repl, string, count=0, flags=0) | |
re.escape(pattern) | |
re.purge() | |
re.error(msg, pattern=None, pos=None) |
re Module Exceptions
Exception | Description |
msg | |
pattern | |
pos | |
lineno | |
colno |
Regular Expression Objects
Object | Description |
Pattern.search(string[, pos[, endpos]]) | |
Pattern.match(string[, pos[, endpos]]) | |
Pattern.fullmatch(string[, pos[, endpos]]) | |
Pattern.split(string, maxsplit=0) | |
Pattern.findall(string[, pos[, endpos]]) | |
Pattern.finditer(string[, pos[, endpos]]) | |
Pattern.sub(repl, string, count=0) | |
Pattern.subn(repl, string, count=0) | |
Pattern.flags | |
Pattern.groups | |
Pattern.groupindex | |
Pattern.pattern | |
Match.expand(template) | |
Match.group([group1, ...]) | |
Match.__getitem__(g) | |
Match.groups(default=None) | |
Match.groupdict(default=None) | |
Match.start([group]) | |
Match.end([group]) | |
Match.span([group]) | |
Match.pos | |
Match.endpos | |
Match.lastindex | |
Match.lastgroup | |
Match.re | |
Match.string |
- match() : 소스와 패턴의 일치 여부를 확인한다.
- match(pattern, source) : 패턴이 소스에 처음에 있는지를 확인한다.
- search(pattern, source) : 첫 번째 일치하는 객체를 반환한다. (패턴의 위치는 관계없음)
- findall(pattern, source) : 중첩에 상관없이 모두 일치하는 문자열 리스트를 반환한다.
- split(pattern, source) : 패턴에 맞게 소스를 쪼갠 후, 문자열 조각의 리스트를 반환한다.
- sub(pattern, substitute source) : 대체 인자를 하나 더 받아서, 패턴과 일치하는 모든 소스 부분을 대체 인자로 변경한다.
- split(pattern, source) : 패턴으로 문자열을 리스트로 나누어 리턴한다.
- group() : 매칭 결과를 리턴한다.
- groups() : 매칭 결과를 튜플로 리턴한다.
- start() : 일치하는 문자열의 시작 index
- end() : 일치하는 문자열의 끝 index
- span() : 일치하는 문자열의 시작과 끝 index
import re
source = 'Young Frankenstein'
m = re.match('You', source)
if m:
print(m.group(0) # You가 출력됨
m = re.match('^You', source) # 문자열이 You로 시작되는지 확인
if m:
print(m.group()) # You가 출력됨
m = re.match('Frank', source)
if m:
print(m.group()) # 아무것도 출력되지 않음
와일드 카드
. = 한 문자를 의미
? = 0 또는 한 개의 문자를 의미
* = 이전 패턴이 여러 개(0회 이상) 올 수 있다는 것을 의미한다.
source = 'Young Frankenstein'
m = re.findall('n.', source) # m에 ['ng', 'nk', 'ns']가 저장됨
특수 문자
- 리터럴은 모든 비특수 문자와 일치한다.
- \n을 제외한 하나의 문자는 . (dot) 이다.
- 0회 이상은 * 로 표현한다.
- 0 또는 1회는 ? 로 표현한다
패턴 | \d | \D | \w | \W | \s | \S | \b | \B |
일치 | 숫자 | 비숫자 | 알파벳 문자 | 비알파벳 문자 | 공백 문자 | 비공백 문자 | 단어 경계* | 비단어 경계 |
* 단어 경계 : \w와 \W 또는 \W와 \w 사이의 경계
string 모듈
- 테스트에 사용할 수 있는 문자열 상수가 미리 정의되어 있는 모듈이다.
- string.printable을 이용해 알파벳 대/소문자, 숫자, 공백 문자, 구두점을 포함한 100가지 아스키 문자를 출력한다.
Pattern Specifier (패턴 지정자)
- expr : 유효한 정규표현식 (표현식)
- prev : 이전 토큰
- next : 다음 토큰
패턴 | 일치 | 패턴 | 일치 |
abc | 리터럴 abc | prev {m} | m회의 prev |
(expr) | expr | prev {m, n} | m에서 n회의 최대 prev |
expr1 | expr2 | expr1 또는 expr2 | prev {m, n}? | m에서 n회의 최소 prev |
. | \n을 제외한 모든 문자 | [abc] | a 또는 b 또는 c (a|b|c와 같음) |
^expr | 소스 문자열의 시작 (Anchor) |
[^abc] | (a 또는 b 또는 c) 가 아님 |
expr$ | 소스 문자열의 끝 (Anchor) |
prev (?=next) | 뒤에 next가 오면 prev |
prev ? | 0 또는 1회의 prev | prev (?!next) | 뒤에 next가 오지 않으면 prev |
prev* | 0회 이상의 최대 prev | (?<=prev) next | 전에 prev가 오면 next |
prev*? | 0회 이상의 최소 prev | (?<!prev) next | 전에 prev가 오지 않으면 next |
prev+ | 1회 이상의 최대 prev | ||
prev+? | 1회 이상의 최소 prev |
re.findall('wish|fish', source) # 소스에서 wish 또는 fish를 모두 찾는다.
re.findall('^wish', source) # 소스가 wish로 시작하는지 찾는다.
- ^와 $는 Anchor라 부른다.
- ^는 검색 문자열의 시작 위치에 고정한다.
- $는 검색 문자열의 마지막 위치에 고정한다.
( .$ 는 가장 마지막에 있는 한 문자와 .를 매칭 한다. 더 정확하게 하려면 문자 그대로 매칭 하기 위해 .에 이스케이프 문자(백 슬래쉬)를 붙여야 한다 = \.$)
- 파이썬의 문자열 규칙과 정규표현식 패턴이 충돌하는 것을 방지하기 위해, 정규 표현식 패턴을 Raw String으로 표현한다.
re.findall(r'\bfish', source) # 본래 파이썬에서 \b는 백스페이스를 의미한다.