도구를 바꿀 때가 됐다는 신호
정규식은 문자열의 모양을 찾고 바꾸는 데 강하지만 모든 구조를 파싱하는 도구는 아니야. 다음 신호가 보이면 전용 파서나 라이브러리가 더 알맞은지 다시 판단해.
- 패턴이 100자를 넘고 계속 자라. 길이는 절대 기준이 아니지만, 예외를 하나 붙일 때마다 다른 사례가 깨진다면 파싱 문제를 밀어 넣고 있다는 강한 신호야.
- 따옴표나 주석 안팎처럼 상태를 추적해야 해. 이스케이프 규칙까지 포함한 렉서나 파서가 더 분명할 수 있어.
- 깊이가 정해지지 않은 중첩을 다뤄야 해. 괄호, 객체, 태그의 구조를 이해하는 파서를 우선 검토해.
- 재귀 같은 엔진별 확장에 의존해야 해. 이식성과 유지보수 비용을 전용 도구와 비교해.
- 정규식 단계를 세 번 이상 연결하고 있어. 절대 기준은 아니지만 중간 상태를 설명하기 어렵다면 이름 붙은 처리 단계나 작은 파서가 더 읽기 쉬울 수 있어.
- 허용되는 공백이나 속성 순서가 조금만 달라져도 깨져. 형식의 문법을 아는 도구가 필요한 신호야.
- 패턴을 소리 내어 설명하기 어려워. 성공과 실패 조건을 테스트로도 설명하기 어렵다면 패턴을 더 늘리기 전에 문제의 경계를 다시 정의해.
중첩 구조에는 파서를 사용해
- HTML과 XML → BeautifulSoup, lxml, DOMParser 같은 형식별 파서
- JSON →
json.loads,JSON.parse - YAML → PyYAML, js-yaml
- 소스 코드 → Python
ast, Babel 파서 같은 AST 도구 - 사용자 정의 언어 → PLY, Lark, nom, ANTLR 같은 렉서와 파서 도구
알려진 형식에는 전용 라이브러리를 사용해
- URL →
urllib.parse,new URL() - 날짜 →
datetime, dateutil, date-fns - 전화번호 → libphonenumber
- IP 주소 →
ipaddress,net.ParseIP - 버전 →
packaging.version, SemVer 라이브러리
정규식과 전용 도구의 역할을 나눠
정규식으로 후보를 빠르게 찾고 전용 도구로 실제 구조와 값을 검증하는 조합도 좋아. 핵심은 더 영리한 패턴을 만드는 것이 아니라, 실패 방식과 유지보수 비용까지 포함해 가장 작은 믿을 만한 해결책을 고르는 거야.