반응형

목차
개요
기초적인 정규표현식이 단순히 패턴을 '찾는' 것에 집중했다면, 심화 과정은 복잡한 텍스트 뭉치 속에서 내가 원하는 데이터만 '정교하게 골라내는' 기술을 다룬다. 실무 데이터는 항상 정형화되어 있지 않기에, 그루핑과 탐색(Lookaround) 같은 고급 기법을 익히는 것은 데이터 처리의 효율성을 결정짓는 핵심 요소이다. 이번 시간에는 복잡한 문자열 파싱의 정수를 다룬다.
1. 그루핑(Grouping): 데이터 추출의 핵심
"'Grouping'은 전체 패턴 중 의미 있는 부분 집합을 정의하는 행위이다."
import re
# ?P<이름> 형식을 통해 그룹에 이름을 부여
pattern = re.compile(r"(?P<name>\w+)\s+(?P<phone>\d{3}-\d{4}-\d{4})")
match = pattern.search("JamTaesik 010-1234-5678")
if match:
print(match.group("name")) # JamTaesik
print(match.group("phone")) # 010-1234-5678
2. 탐욕과 절제(Non-Greedy)
2.1 게으른 수량자 ('?')의 활용
기본 수량자는 문장의 끝까지 탐색하려는 성질이 있다. '?'를 붙여 최소한의 매칭만 수행하도록 제한할 수 있다.
html = "<div>First</div><div>Second</div>"
# 1. 탐욕적 매칭 (Greedy)
greedy = re.search(r"<.+>", html).group()
# 2. 절제적 매칭 (Non-Greedy)
lazy = re.search(r"<.+?>", html).group()
[실행 결과 비교]
Greedy 매칭 결과: <div>First</div><div>Second</div>
Non-Greedy 매칭 결과: <div>
Greedy 매칭 결과: <div>First</div><div>Second</div>
Non-Greedy 매칭 결과: <div>
3. 탐색(Lookaround): 조건부 위치 검사
데이터를 추출할 때 특정 문자를 기준으로 앞이나 뒤를 검사하되, 그 기준 문자는 결과에 포함하지 않는 고난도 테크닉이다.
💡 문법 가이드
- 긍정 전방 탐색 (?=...): 특정 패턴이 뒤에 오는 위치를 찾음
- 긍정 후방 탐색 (?<=...): 특정 패턴이 앞에 오는 위치를 찾음
- 긍정 전방 탐색 (?=...): 특정 패턴이 뒤에 오는 위치를 찾음
- 긍정 후방 탐색 (?<=...): 특정 패턴이 앞에 오는 위치를 찾음
3.1 전방 및 후방 탐색 통합 예제
통화 기호와 단위가 섞인 텍스트에서 순수 숫자만 추출하는 예제이다.
text = "Pay $500 for the item, and 1000won for delivery."
# 1. 후방 탐색: '$' 뒤의 숫자 추출
dollar_amount = re.findall(r"(?<=\$)\d+", text)
# 2. 전방 탐색: 'won' 앞의 숫자 추출
won_amount = re.findall(r"\d+(?=won)", text)
print(f"Dollar: {dollar_amount}, Won: {won_amount}")
# 결과: Dollar: ['500'], Won: ['1000']
4. 문자열 치환 및 활용
단순히 찾는 것을 넘어 're.sub()'를 이용하면 매칭된 데이터를 기반으로 구조를 재정의할 수 있다. 특히 그룹 참조('\g<번호>')는 포맷 변경에 매우 유용하다.
data = "2026-01-27"
# 날짜 형식을 월/일/년 순으로 교체
new_data = re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\g<2>/\g<3>/\g<1>", data)
print(f"Original: {data}")
print(f"Converted: {new_data}")
[실행 결과 확인]
Original: 2026-01-27
Converted: 01/27/2026
Original: 2026-01-27
Converted: 01/27/2026
🔎 정규표현식 패턴 상세 설명:
위 코드에서 사용된 패턴 '(\d{4})-(\d{2})-(\d{2})'은 하이픈을 기준으로 년(4자리), 월(2자리), 일(2자리)을 각각의 소괄호 그룹으로 묶은 것이다. 이렇게 정규표현식을 사용하면 'new_data'는 기존의 순서를 무시하고 우리가 참조한 그룹 순서에 따라 '01/27/2026'과 같은 형태로 변경된다. 복잡한 텍스트 포맷을 일괄 변경해야 할 때 이보다 강력한 도구는 없다.
위 코드에서 사용된 패턴 '(\d{4})-(\d{2})-(\d{2})'은 하이픈을 기준으로 년(4자리), 월(2자리), 일(2자리)을 각각의 소괄호 그룹으로 묶은 것이다. 이렇게 정규표현식을 사용하면 'new_data'는 기존의 순서를 무시하고 우리가 참조한 그룹 순서에 따라 '01/27/2026'과 같은 형태로 변경된다. 복잡한 텍스트 포맷을 일괄 변경해야 할 때 이보다 강력한 도구는 없다.
Conclusion
정규표현식 심화 과정은 단순히 문법을 암기하는 것이 아니라, 텍스트의 구조를 논리적으로 분해하는 과정이다. 그루핑과 탐색을 자유자재로 다루게 되면 어떤 복잡한 비정형 데이터라도 원하는 정보로 탈바꿈시킬 수 있다.
이제 복잡한 정규표현식의 원리를 완벽히 이해했다면,
여러분의 코드는 방대한 데이터 속에서도 원하는 정보만을 정확히 찾아낼 것이다.
반응형
'Dev > Python' 카테고리의 다른 글
| 인공지능 기초 개념과 실습 with Python (0) | 2026.02.11 |
|---|---|
| 구글 코랩(Colab)으로 AI 시작해보기 with Python (0) | 2026.02.09 |
| 파이썬 중급 : 리스트 컴프리헨션(List Comprehension) (0) | 2026.01.26 |
| 파이썬 심화: 텍스트의 완성, '정규표현식(Regex)'의 기초 (0) | 2026.01.22 |
| 파이썬 기초: 데이터 처리의 핵심, '문자열(String) 조작법' (0) | 2026.01.21 |