본문 바로가기
C.W.K.
Stream
Lesson 01 of 10 · published

텍스트에서 패턴 찾는 문제

~10 min · intro, motivation, use-cases

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

왜 텍스트 모양 전용 작은 언어가 필요했을까

4GB짜리 로그 파일에서 IP 주소 뒤에 5xx HTTP 상태가 붙은 줄을 모두 찾아야 한다고 해 봐. Python 스크립트로 짜면 줄을 나누고, 세 번째 열을 읽고, IP인지 확인하고, 상태가 5로 시작하는지도 검사해야 해. 코드 스무 줄을 쓰고 열 번호가 맞는지 디버깅하다가 30분이 날아가지.

정규식이라면 \b\d+\.\d+\.\d+\.\d+\b.*\b5\d{2}\b 한 줄을 ripgrep으로 돌리면 돼. 한 줄이고, 실행은 0.5초면 끝나.

정규식이 존재하는 이유가 바로 이 차이야. 질문이 "어느 문자열이 이 패턴과 맞지?"라면 손으로 파싱하는 건 지나치게 큰 도구를 쓰는 셈이거든. 정규식은 텍스트 모양만 묘사하는 작은 패턴 문법이야.

정규식이 진짜 잘하는 세 가지

검색. "이 더미에서 특정 모양인 것을 모두 찾아." 에디터, IDE, 로그 분석기, 보안 스캐너가 이 일을 해.

유효성 검증. "이 문자열 전체가 원하는 모양과 맞아?" 폼 필드, 설정 파서, 라우트 매칭에서 써.

추출과 치환. "이 문자열에서 원하는 부분만 빼줘" 또는 "이 모양을 전부 저 모양으로 바꿔줘." 데이터 정제, 코드 일괄 변환, 빌드 스크립트에 잘 맞아.

반대로 중첩 구조 파싱, 의미 추적, HTML이나 JSON 전체 해석은 이 목록에 없어. 트랙 끝에서 이 한계를 다시 짚어줄게.

Code

정규식 없이 짠 스크립트·python
# IP 주소 + 5xx 상태가 같이 있는 줄 찾기
import re_disabled  # 정규식이 없다고 가정

with open('access.log') as f:
    for line in f:
        parts = line.split()
        if len(parts) < 9:
            continue
        ip = parts[0]
        status = parts[8]
        # 이제 IP 검증기를 만들고 상태도 확인해야 해...
        # 코드 스무 줄 추가, 인덱스가 하나씩 밀리는 버그 세 개.
정규식으로 같은 일·bash
# 한 줄. 4 GB 파일을 몇 초 만에 흘려.
rg '\b\d+\.\d+\.\d+\.\d+\b.*\b5\d{2}\b' access.log

External links

Exercise

아무 텍스트 파일이나 열어봐. 로그, CSV 내보내기, 채팅 기록이면 충분해. 거기서 찾고 싶은 *모양* 세 개를 골라. 전화번호, 날짜, URL, 대문자로 시작하는 이름 같은 것 말이야. 각각의 모양을 우리말 한 문장으로 *정확하게* 묘사해 봐. 나머지 퀘스트에서는 그 문장을 패턴으로 옮기는 훈련을 할 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.