Python 정규표현식(re 모듈) 실전 가이드
Python 정규표현식(re 모듈) 실전 가이드
Python re 모듈로 정규표현식 위력 활용법 알아보기. 단계별 예제로 일반 패턴, 매칭 기법, 고급 함수 설명.
정규표현식이란?
정규표현식(RegEx)은 검색 패턴 정의하는 문자 시퀀스. 예: 패턴 ^a...s$는 a로 시작해 s로 끝나는 5글자 문자열 매칭.
^a...s$
패턴으로 문자열 매칭 가능. 다음 표는 패턴이 다른 입력에 어떻게 동작하는지 보여줌:
| 표현식 | 문자열 | 매칭? |
^a...s$ | abs | 불일치 |
alias | 일치 |
abyss | 일치 |
Alias | 불일치 |
An abacus | 불일치 |
Python re 모듈이 RegEx 작업 도구 제공. re.match()로 패턴을 문자열에 대조하는 빠른 예:
import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
print("Search successful.")
else:
print("Search unsuccessful.")
패턴 발견 시 re.match()가 매치 객체 반환, 아니면 None.
메타문자로 패턴 지정
메타문자는 정규식 엔진이 특별히 해석하는 특수 기호. 가장 흔한 메타문자 빠른 참조:
[] . ^ $ * + ? {} () \ |
대괄호: []
대괄호는 매칭할 문자 집합 정의. 예: [abc]는 a, b, c 중 단일 출현 매칭.
| 표현식 | 문자열 | 매칭? |
[abc] | a | 1 매칭 |
ac | 2 매칭 |
Hey Jude | 불일치 |
abc de ca | 5 매칭 |
범위는 하이픈으로 표현, 예: [a-e] = [abcde]. 집합 반전은 여는 대괄호 뒤 캐럿 ^, 예: [^abc]는 a, b, c 제외 모든 문자 매칭.
마침표: .
개행 제외 임의 단일 문자 매칭.
| 표현식 | 문자열 | 매칭? |
.. | a | 불일치 |
ac | 1 매칭 |
acd | 1 매칭 |
acde | 2 매칭 (4 문자 포함) |
캐럿: ^와 달러: $
캐럿은 문자열 시작, 달러는 끝 단언. 예: ^a는 a로 시작하는 모든 문자열, a$는 a로 끝나는 모든 문자열 매칭.
| 표현식 | 문자열 | 매칭? |
^a | a | 1 매칭 |
abc | 1 매칭 |
bac | 불일치 |
^ab | abc | 1 매칭 |
acb | 불일치 (a로 시작하지만 b 안 따름) |
| 표현식 | 문자열 | 매칭? |
a$ | a | 1 매칭 |
formula | 1 매칭 |
cab | 불일치 |
수량자: *, +, ?, {n,m}
이 기호들은 앞 요소 출현 횟수 제어.
* – 0회 이상.
+ – 1회 이상.
? – 0회 또는 1회.
{n,m} – 최소 n회, 최대 m회.
예시:
| 표현식 | 문자열 | 매칭? |
ma*n | mn | 1 매칭 |
man | 1 매칭 |
maaan | 1 매칭 |
main | 불일치 (a 뒤 n 아님) |
woman | 1 매칭 |
| 표현식 | 문자열 | 매칭? |
ma+n | mn | 불일치 (a 없음) |
man | 1 매칭 |
maaan | 1 매칭 |
main | 불일치 (a 뒤 n 아님) |
woman | 1 매칭 |
| 표현식 | 문자열 | 매칭? |
ma?n | mn | 1 매칭 |
man | 1 매칭 |
maaan | 불일치 (a 1개 초과) |
main | 불일치 (a 뒤 n 아님) |
woman | 1 매칭 |
| 표현식 | 문자열 | 매칭? |
a{2,3} | abc dat | 불일치 |
abc daat | 1 매칭 (daat) |
aabc daaat | 2 매칭 (aabc와 daaat) |
aabc daaaat | 2 매칭 (aabc와 daaaat) |
자주 쓰이는 패턴: [0-9]{2,4}는 2~4자리 연속 숫자 매칭.
| 표현식 | 문자열 | 매칭? |
[0-9]{2,4} | ab123csde | 1 매칭 (ab123csde) |
12 and 345673 | 3 매칭 (12, 3456, 73) |
1 and 2 | 불일치 |
선택: |
수직 막대 논리 OR 구현. 예: a|b는 a 또는 b 포함 문자열 매칭.
| 표현식 | 문자열 | 매칭? |
a|b | cde | 불일치 |
ade | 1 매칭 (ade) |
acdbea | 3 매칭 (acdbea) |
그룹핑: ()
괄호로 하위 패턴 그룹화 및 매칭 부분 문자열 캡처. 예: (a|b|c)xz는 a, b, c 중 하나 뒤 xz 따르는 문자열 매칭.
| 표현식 | 문자열 | 매칭? |
(a|b|c)xz | ab xz | 불일치 |
abxz | 1 매칭 (abxz) |
axz cabxz | 2 매칭 (axzbc cabxz) |
이스케이프: \
메타문자를 리터럴로 취급하려면 백슬래시 사용. 예: \$a는 $a 리터럴 시퀀스 매칭, $를 문자열 끝 앵커로 해석 안 함.
특수 시퀀스
특수 시퀀스 흔한 패턴 단순화. 예시와 함께 참조 목록:
문자열 시작: \A
| 표현식 | 문자열 | 매칭? |
\Athe | the sun | 일치 |
In the sun | 불일치 |
단어 경계: \b
| 표현식 | 문자열 | 매칭? |
\bfoo | football | 일치 |
a football | 일치 |
afootball | 불일치 |
foo\b | the foo | 일치 |
the afoo test | 일치 |
the afootest | 불일치 |
비단어 경계: \B
| 표현식 | 문자열 | 매칭? |
\Bfoo | football | 불일치 |
a football | 불일치 |
afootball | 일치 |
foo\B | the foo | 불일치 |
the afoo test | 불일치 |
the afootest | 일치 |
숫자: \d / 비숫자: \D
| 표현식 | 문자열 | 매칭? |
\d | 12abc3 | 3 매칭 (12abc3) |
Python | 불일치 |
\D | 1ab34"50 | 3 매칭 (1ab34"50) |
1345 | 불일치 |
공백: \s / 비공백: \S
| 표현식 | 문자열 | 매칭? |
\s | Python RegEx | 1 매칭 |
PythonRegEx | 불일치 |
\S | a b | 2 매칭 ( a b) |
| 불일치 |
단어 문자: \w / 비단어: \W
| 표현식 | 문자열 | 매칭? |
\w | 12&": ;c | 3 매칭 (12": ;c) |
"%> ! | 불일치 |
\W | 1a2%c | 1 매칭 (1a2%c) |
Python | 불일치 |
문자열 끝: \Z
| 표현식 | 문자열 | 매칭? |
Python\Z | I like Python | 1 매칭 |
I like Python Programming | 불일치 |
Python is fun. | 불일치 |
팁: regex101 같은 온라인 정규식 테스터로 패턴 빠르게 작성/디버깅.
Python에서 RegEx 사용
Python re 모듈은 정규식 연산용 풍부한 함수/상수 제공. 임포트:
import re
가장 흔한 유틸리티와 사용법:
re.findall()
문자열에서 겹치지 않는 모든 매칭 리스트 반환.
# 문자열에서 모든 숫자 추출
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result) # 출력: ['12', '89', '34']
매칭 없으면 빈 리스트 반환.
re.split()
패턴 매칭 지점마다 문자열 분할해 부분문자열 리스트 반환.
import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result) # 출력: ['Twelve:', ' Eighty nine:', '.']
선택적 maxsplit 인수로 분할 횟수 제한. 0(기본)은 모든 매칭에서 분할.
import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# 첫 번째 발생만 분할
result = re.split(pattern, string, 1)
print(result) # 출력: ['Twelve:', ' Eighty nine:89 Nine:9.']
re.sub()
패턴 모든 출현을 치환 문자열로 대체.
# 모든 공백 문자 제거
import re
string = 'abc 12\nde 23 \n f45 6'
pattern = '\s+'
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string) # 출력: abc12de23f456
치환 제한하려면 count 인수 제공. 0이면 모든 매칭 치환.
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string) # 출력: abc12de 23 f45 6
re.subn()
re.sub() 같지만 새 문자열과 치환 횟수 담은 튜플 반환.
new_string = re.subn(pattern, replace, string)
print(new_string) # 출력: ('abc12de23f456', 4)
re.search()
패턴 매칭되는 첫 위치 찾기.
string = "Python is fun"
match = re.search('\\APython', string)
if match:
print("pattern found inside the string")
else:
print("pattern not found")
# 출력: pattern found inside the string
매치 객체
매칭 발견 시 re.search()가 Match 객체 반환. 주요 메서드/속성:
group() – 매칭된 부분문자열.
start() / end() – 매칭 인덱스.
span() – (시작, 끝) 튜플.
groups() – 모든 캡처 그룹.
string = '39801 356, 2102 1111'
pattern = '(\\d{3}) (\\d{2})'
match = re.search(pattern, string)
if match:
print(match.group())
print(match.group(1))
print(match.group(2))
print(match.groups())
print(match.start(), match.end(), match.span())
else:
print("pattern not found")
# 출력:
# 801 35
# 801
# 35
# ('801', '35')
# 2 8 (2, 8)
Raw 문자열 사용 (접두사 r)
문자열 리터럴에 r 접두사 붙이면 백슬래시 리터럴로 취급돼 의도치 않은 이스케이프 시퀀스 방지. 정규식 패턴에 특히 유용.
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result) # 출력: ['\n', '\r']
re 모듈 더 깊게는 공식 Python 문서 참조.