그룹, 선택, 치환을 한 작업 안에서 연결해
이제 입력을 조각으로 나누고, 여러 모양 가운데 하나를 고르고, 캡처한 값을 새 순서로 조립할 수 있어. 세 가지 작업을 보며 어느 지점부터 전용 파서를 써야 하는지도 함께 확인해 봐.
작업 1: 로그 시간 형식 통일하기
2026-05-04T14:32:11Z, 04/May/2026 14:32:11, 14:32:11 04 May 2026처럼 출처마다 다른 시간 형식이 올 수 있어. 각 모양에 맞는 패턴을 만들고 연도, 월, 일, 시각에 이름을 붙여 캡처해.
숫자 월과 영문 월을 서로 바꾸려면 역참조만으로는 부족해. 치환 함수에서 월 이름과 번호를 대응시킨 다음 하나의 표준 형식으로 다시 조립해야 해.
작업 2: 제한된 한 줄 CSV 이해하기
Pippa,"3, going on 30",warm처럼 따옴표 안에 쉼표가 있는 한 줄을 생각해 봐. (?:"([^"]*)"|([^,]*))(?:,|$)는 이스케이프된 따옴표와 줄바꿈이 없는 제한된 입력을 설명하는 학습용 패턴이야. finditer로 그대로 돌리면 문자열 끝에 가짜 빈 필드까지 생길 수 있으니 실제 CSV에는 csv 같은 전용 라이브러리를 써.
작업 3: Markdown 일부를 바꾸기
re.sub(r'\*\*([^*]+)\*\*', r'<strong>\1</strong>', text)는 단순한 **bold** 조각을 <strong>bold</strong>로 바꿔. 통제된 일회성 변환에는 쓸 수 있지만 중첩과 이스케이프까지 포함한 실제 Markdown은 검증된 파서가 맡아야 해.
조합할 때 지킬 순서
- 이름 붙은 그룹으로 입력의 의미 있는 조각을 캡처해.
- 값이 필요 없는 괄호는 비캡처 그룹으로 써.
- 이미 알고 있는 입력 변형만 선택으로 표현해.
- 조각을 재배열할 때는 역참조나 치환 함수를 사용해.
- 정상 입력과 함께 실패하기 쉬운 입력도 최소 하나씩 시험해.
정규식이 입력 모양을 설명하는 범위를 넘어 문법 전체를 파싱하기 시작한다면, 더 길게 밀어붙이지 말고 전용 파서로 경계를 넘겨.