Python 강좌 / 정규 표현식으로 문자열 검색하고 추출하기
정규 표현식은 문자열에서 일정한 패턴을 찾거나 전체 형식을 검사하는 도구입니다. 형식에 맞는 문자열을 찾았다고 날짜나 금액의 업무 규칙까지 검증된 것은 아니므로 파싱과 의미 검증을 구분합니다.
검색·전체 일치·반복 검색
| 함수 | 목적 |
|---|---|
| re.search | 어딘가에 일치하는 부분이 있는지 찾기 |
| re.fullmatch | 문자열 전체가 패턴에 맞는지 검사 |
| re.finditer | 일치 항목과 위치를 차례로 읽기 |
Python 문자열의 이스케이프와 정규식의 이스케이프가 겹치므로 보통 r"..." 원시 문자열을 사용합니다. 원시 문자열도 아무 문자를 무제한 허용하는 것은 아니며 끝의 역슬래시 등 문자열 문법의 제약이 있습니다.
관련 동작과 지원 조건은 정규 표현식으로 문자열 검색하고 추출하기 관련 공식 문서에서 확인할 수 있습니다.
전체 예제와 실행 결과
별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python regex_demo.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.
regex_demo.py 파일의 전체 내용입니다.
import re
from datetime import date
text = "A001:3500 B002:8000"
pattern = re.compile(r"(?P<id>[A-Z][0-9]{3}):(?P<amount>[0-9]+)")
for match in pattern.finditer(text):
print(match["id"], int(match["amount"]))
value = "2026-10-17"
if re.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}", value):
print(date.fromisoformat(value))
예상 결과는 다음과 같습니다.
A001 3500 B002 8000 2026-10-17
그룹과 일치 실패 처리
괄호 그룹은 일치 부분을 나누고 이름 있는 그룹은 필드 의미를 드러냅니다. match가 None일 수 있으므로 바로 group()을 부르기 전에 확인합니다. 검색용 패턴은 일부만 맞아도 결과를 낼 수 있으므로 검증에는 fullmatch를 검토합니다.
예제의 날짜 정규식은 2026-99-99 같은 형태도 통과시킵니다. 실제 달력 검증은 date.fromisoformat이 수행합니다. HTML이나 복잡한 CSV 전체 문법을 정규식 하나로 파싱하기보다 해당 형식의 파서를 사용합니다.
패턴 복잡도와 입력 범위
외부 입력에서 받은 정규식을 그대로 실행하거나 중첩 반복이 많은 패턴에 무제한 길이의 문자열을 넣으면 처리 시간이 매우 길어질 수 있습니다. 허용 패턴을 고정하고 입력 길이를 제한하는 등 실행 범위를 관리합니다.
- A001을 a001로 바꿔 대문자 조건의 영향을 확인합니다.
- 금액을 -1로 바꿔 현재 패턴의 허용 범위를 확인합니다.
- 날짜 형식은 맞지만 존재하지 않는 2026-02-30을 넣어 파싱 단계에서 실패하는지 확인합니다.




