본문 바로가기
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

한 줄짜리 구조화 데이터를 추출하기

로그 줄이나 일정한 key=value 목록처럼 한 줄 안에서 모양이 반복되는 데이터는 캡처 그룹으로 필드를 나눌 수 있어. 중첩되거나 이스케이프 규칙이 복잡한 형식은 전용 파서에 맡겨.

로그 줄의 필드 이름 붙이기

IP, 날짜, 메서드, 경로, 상태 코드, 바이트 수처럼 필요한 조각마다 이름 붙은 그룹을 두면 패턴 자체가 한 줄 형식의 명세처럼 읽혀. groupdict()로 결과를 바로 사전 형태로 받을 수도 있어.

key=value 쌍 추출하기

name=Pippa age=3 mood=warm에는 (\w+)=(\S+)findall을 쓸 수 있어. 따옴표 안에 공백을 허용하려면 (\w+)=(?:"([^"]*)"|(\S+))처럼 따옴표 값과 공백 없는 값을 대안으로 나눠.

패턴보다 먼저 모양을 적어

  1. 필드와 구분자를 자연어로 적어.
  2. 각 필드가 숫자, 16진수, 따옴표 문자열 중 무엇인지 정해.
  3. 필요한 필드를 이름 붙은 캡처 그룹으로 감싸.
  4. 정상 입력과 오류 입력, 경계 입력으로 시험해.

이 순서를 따르면 패턴이 데이터 형식의 설명서 역할까지 하게 돼.

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 쌍 (선택적 따옴표)
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

실제로 다루는 한 줄 형식 하나를 골라봐. 로그, 반구조화 설정, 따옴표가 섞인 단순 CSV면 충분해. 의미 있는 필드를 이름 붙은 그룹으로 추출하고 re.VERBOSE로 읽기 쉽게 배치해. 패턴이 그 줄 형식의 명세처럼 읽혀야 해.

Progress

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

댓글 0

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

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