본문 바로가기

Languages/Python

[파이썬 101] 정규표현식

728x90

 

 

메타 문자

메타 문자 설명
. 개행 문자 (\n)를 제외한 모든 문자와 매칭
^ 문자열의 제일 처음과 일치함
$ 문자열의 제일 마지막과 일치함
* * 바로 앞의 문자가 0번 이상 무한대로 반복될 수 있음
+ + 바로 앞의 문자가 1번 이상 무한대로 반복될 수 있음
? 바로 앞의 문자가 0번이나 1번 있을 경우
\ 이스케이프
| or 조건
( ) 그룹핑 문자
{ } 앞의 문자의 반복 횟수 조건 제한
[ ] 문자 집합

 

 

' . '

사용법 설명 매칭 O 매칭 X
a.b c와 b 사이 문자 하나 aab, a0b, a*b, a.b ab, a\nb

 - 개행 문자를 제외한 문자 하나를 뜻함. (숫자 포함, 특수문자 포함, 띄어쓰기 포함)

 - re.DOTALL 옵션을 줄 경우 개행 문자와도 매치

 

 

' * '

사용법 설명 매칭 O 매칭 X
ca*t c와 t 사이 'a' 0개 이상 ct, cat, caat, caaat cut, coat
c(oa)*t c 와 t 사이 'oa' 0개 이상 ct, coat, coaoat cot, cat, coaat

 - 0개 이상이 핵심. (없어도 됨)

 

 

' + '

사용법 설명 매칭 O 매칭 X
ca+t c 와 t 사이 'a' 1개 이상 cat, caat, caaat ct, cut, coat
c(oa)+t c 와 t 사이 'oa' 1개 이상 coat, coaoat ct, cot, cat

 - 1개 이상. (무조건 있어야 함)

 

 

' { } '

사용법 설명 매칭 O 매칭 X
ca{2}t c와 t 사이 'a' 두번 ct, cat, caaat caat
ca{2, 5}t c와 t 사이 'a' 2~5회 caat, caaaaat ct, cat, caaaaaat
c(oa){1, 2}t c와 t 사이 'oa 1~2회 coat, coaoat ct, coaoaoat

 

 

' ? '

사용법 설명 매칭 O 매칭 X
ca?t c와 t 사이 a가 있어도 없어도 된다 ct, cat caat, cbt
c(oa)?t c와 t 사이 'oa'가 있어도 없어도 된다 ct, coat coaoat, cot, cat

 - 0 또는 1회 개념

 

 

' | '

사용법 설명 매칭 O  매칭 X
c(a|u)t c와 t 사이 a나 o가 들어와야함 cat, cot ct, coat, caot
co|at 'co' 혹은 'at' co, at cat, cot

 

 

' ^ '

사용법 설명 매칭 O 매칭 X
^abc abc로 시작 abc, abcde,  ab, abde
^ab?c ac나 abc로 시작 ac, acd, abc, abcd abbc

 

 

' $ '

사용법 설명 매칭 O 매칭 X
cde$ cde로 끝나는 글자 cde, abcde abde

 

 

' [ ] '

사용법 설명 매칭 O 매칭 X
[a] 'a'가 들어가있는 모든 문자열 a, aa, cat, coat ct, b
[ab] 'a'나 'b'가 들어가있는 모든 문자열 a, b, cat, cab at, c
[a-z] 알파벳 소문자가 포함되어 있는 문자열 a, b, c, d, CaT A, B, C, CAT
[가-힣] 완성형 한글 가, 가나, 힣 ㄱ, ㅌ
[a-zA-z0-9] 알파벳 소문자와 숫자 a, A, 0, af0fcf3158 *****
[^a] 'a'를 제외한 모든 문자 포함 b, cat, coat a, aa, aaa, aaaa
[^0-9] 숫자를 제외한 모든 문자 a, a1, a2 010, 0, 9
[^abc] a,b,c를 제외한 모든 문자 d, abcd a, abc

 

 

' \ '

이스케이프 설명 같은 의미의 정규표현식 / 예시
\A 문자열의 처음과 매칭 (re.MULTILINE 사용시 개행 구분 X) ^ (re.MULTILINE 옵션 사용 X의 경우)
\Z 문자열의 마지막과 매칭 (re.MULTILINE 사용시 개행 구분 X) $ (re.MULTILINE 옵션 사용 X 경우)
\b 단어 구분자. (공백) er\b : never
\ber\b : er
\B 단어 구분자를 제외한 전부 er\B : erp
\Ber\B : verb
\d 숫자 (digit) [0-9]
\D 숫자가 아닌 문자 [^0-9]
\c_ _로 표시된 제어 문자를 찾음 \cc : ctrl + c
\cs : ctrl + s
\f 용지 공급 문자 \xOc, \cL
\n 개행 문자 \xOa, \cJ 
\r 캐리지 리턴 문자 \xOd, \cM
\s 공백 문자 (공백, 탭, 용지공급 등..) [\f\n\r\t\v] 
\S 공백이 아닌 문자 [^\f\n\r\t\v] 
\t 탭 문자 \x09, \cL 
\v 수직 탭 문자 \x09, \cK 
\w 밑줄을 비롯한 모든 문자 [A-Za-z0-9_] 
\W 공백, _ 를 제외한 특수 문자 등.. [^A-Za-z0-9_]
\x_ 16진수 문자 _ (ASXII 코드) \x41 : A
\x041 : \x04 & 1
\Z 문자열 끝에만 일치  

 - \b 는 문자열 안에서만 백스페이스

 

 

' ( ) '

import re

input = '홍길동 010-1234-5678 홍길동 010'

p1 = re.compile(r'(\w+)\s+(\d+)[-](\d+)[-](\d+)')
m1 = p1.search(input)
print(m1.group(1), m1.group((2)))
print()

p2 = re.compile(r'(?P<name>\w+)\s+(\d+)[-](\d+)[-](\d+)')
m2 = p2.search(input)
print(m2.group('name'))

p3 = re.compile(r'(?P<name>\w+)\s+(\d+)[-](\d+)[-](\d+)\s+(?P=name)\s+\2')
m3 = p3.search(input)
print(m3)

 

 - ()으로 특정 정규식을 감싸면 그룹이 됨

 - 출된 그룹은 group(idx)로 접근할 수 있음

 - 추출된 그룹을 인덱스(\1, \2, \3...)로 재참조 할 수 있음 (예시 : 그룹 + " " + 그룹과 동일한 단어)

 - (\w+) 등 대신 (?P<그룹명>\w+)를 하면 ㄱ,룹에 이름을 붙일 수 있음.

 - (?P=그룹명) 으로 정규식 안에서 재참조 가능

용법 설명 비고
(...) 그룹. '\숫자'로 재참조 가능  
(?aiLmsux) a, i, L, m, s, u, x 중 선택.
re.compile()에 들어가는 플래그를 대신 전달
re.A : ASCII만 일치
re.I : 케이스 무시
re.L : 로케일 종속
re.M : 여러 줄
re.S : 점이 모든 문자와 일치
re.U : 유니코드 일치
re.X : 상세모드
(?:...) 일반 괄호와 같지만 '\숫자'로 재참조할 수 없음  
(?aiLmsux-imsx:...) 정규식의 일부에 대해 플래그 조건 제거 가능  
(?P<그룹명>...) 일반 괄호와 같지만 그룹명을 통해 재참조 가능  
(?P=그룹명) 이름이 있는 그룹에 대한 역참조  
(?#...) 주석  
(?=...) 문자열을 소비하지 않고 뒤에 일치가 있으면 일치 abc(?=def) : 뒤에def가 있을 때만 abc를 일치
(?!...) 문자열을 소비하지 않고 뒤에 일치가 없으면 일치 abc(?!def) : 뒤에 def가 없을 때만 abc를 일치
(?<=...) 앞에서 일치가 있으면 일치 (?<=abc)def : 앞에 abc가 있을 때만 def를 일치
(?<!...) 앞에서 일치가 없으면 일치 (?<!abc)def : 앞에 abc가 없을 때만 def를 일치
(?(아이디/그룹명)yes-pattern)|no-pattern 주어진 아이디나 그룹명이 있으면 yes-pattern과 일치
없으면 no-pattern과 일치
 

 

 

참조
 - 파이썬 공식문서
 - 불곰 님의 블로그
 - 점프 투 파이썬
반응형