C.W.K.
Stream
Lesson 08 of 12 · published

실전 추출 — 구조 데이터 빼기

~12 min · practical, extraction, parsing

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

정규식이 파서 — 허락하면

캡처 그룹 + anchor + character class 조합이 정규식을 줄 모양 데이터의 진짜 파서로 바꿈. 로그 줄, CSV-비슷 파일, 반-구조 config — 한 줄에 맞고 모양 따르는 거 어떤 거든 정규식 추출 가능.

패턴: 로그 엔트리

Apache 식 로그 줄: 192.168.1.1 - - [04/May/2026:14:32:11 +0000] "GET /api/data HTTP/1.1" 200 1234. 필드 추출:

(?P<ip>[\d.]+) - - \[(?P<date>[^\]]+)\] "(?P<method>\w+) (?P<path>[^ ]+) [^"]+" (?P<status>\d+) (?P<bytes>\d+)

Named 그룹 다섯. 패턴이 거의 spec 처럼 읽힘.

패턴: key=value 쌍

name=Pippa age=3 mood=warm 같은 줄. 모든 쌍 추출: (\w+)=(\S+)findall[('name', 'Pippa'), ('age', '3'), ('mood', 'warm')] 반환.

값에 공백 포함 가능 (name="Pippa Choi") 면 업그레이드: (\w+)=(?:"([^"]*)"|(\S+)) — quoted 또는 bare 값 캡처.

모양 우선 메서드

패턴은 항상 한국어/영어로 모양 묘사부터:

  1. 단어, 구분자, 단어, 구분자, ...
  2. 각 조각 식별 (숫자? hex? quoted 문자열? 단어?).
  3. 쓸 각 조각을 named 캡처 그룹으로 wrap.
  4. 입력 셋 테스트: known-good, known-bad, edge case.

이게 production 추출 패턴 작성되는 방식.

Code

실전 추출·python
import re

# Apache 식 로그 줄
LOG = re.compile(r'''
    (?P<ip>[\d.]+)
    \s+-\s+-\s+
    \[(?P<date>[^\]]+)\]
    \s+"(?P<method>\w+)\s+(?P<path>[^ ]+)\s+[^"]+"
    \s+(?P<status>\d+)
    \s+(?P<bytes>\d+)
''', re.VERBOSE)

line = '192.168.1.1 - - [04/May/2026:14:32:11 +0000] "GET /api/data HTTP/1.1" 200 1234'
m = LOG.match(line)
print(m.groupdict())
# {'ip': '192.168.1.1', 'date': '04/May/2026:14:32:11 +0000',
#  'method': 'GET', 'path': '/api/data', 'status': '200', 'bytes': '1234'}

# Key=value 쌍 (optional 따옴표)
KV = re.compile(r'(\w+)=(?:"([^"]*)"|(\S+))')
for m in KV.finditer('name="Pippa Choi" age=3 mood=warm'):
    key, quoted, bare = m.groups()
    value = quoted if quoted is not None else bare
    print(f'{key}: {value}')
# name: Pippa Choi
# age: 3
# mood: warm

External links

Exercise

본인 일에서 구조 줄 포맷 하나 골라 (로그, 반-구조 config, 이상한 따옴표 csv). 모든 의미 있는 필드 추출하는 named 그룹 정규식 작성. Verbose 모드 사용. 패턴이 줄 포맷의 spec 처럼 읽혀야.

Progress

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

댓글 0

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

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