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

Greedy vs Lazy — 언제 중요한가

~8 min · greedy, lazy, decision

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

패턴 나머지도 유연할 때만 중요

Greedy 와 lazy 는 패턴 나머지가 명확할 때 같은 결과. \d+abc\d+?abc1234abc 에 같은 매칭 — 가능한 매칭 한 가지뿐.

차이가 보이는 건 패턴 경계가 흐릿할 때: 엔진이 다음에 찾는 게 여러 위치에 등장할 수 있을 때. 그러면 greedy 는 마지막 가능 위치, lazy 는 첫 위치에 멈춤.

경험칙 셋

1. 마커 사이 추출? Lazy 또는 negated class. 태그, 따옴표 문자열, 주석, 괄호 친 거 다. 첫 닫는 마커가 원하는 거.

2. 고정 모양 입력 검증? Greedy OK, 종종 더 좋음. 전화번호, 날짜, ID — 매칭 한 방법뿐. Greedy 가 성공 케이스에 backtrack 약간 적게.

3. 노이즈 텍스트에서 한 번 검색? Greedy 기본. 로그, 자유 형식 문서. 보통 "패턴에 맞는 만큼" 원함, 그게 진짜 값일 가능성 크니까.

'그냥 모름' 기본값

결정 못 하면 greedy 먼저 작성, 실제 입력에 매칭하는 거 확인. 너무 먹으면 lazy 또는 negated class 로 전환. "안전하게 들리니까" 미리 lazy 손 뻗지 마 — 때론 greedy 가 실제 원하는 거.

Code

선택이 안 중요한 때·python
import re

# Greedy 와 lazy 가 같은 결과
re.findall(r'\d+abc', '1234abc')   # ['1234abc']
re.findall(r'\d+?abc', '1234abc')  # ['1234abc']  — 같음

# 하지만 경계가 모호한 순간 갈림
re.findall(r'<.*>', '<a><b><c>')   # ['<a><b><c>']  greedy
re.findall(r'<.*?>', '<a><b><c>')  # ['<a>', '<b>', '<c>']  lazy

External links

Exercise

멀티라인 HTML 또는 Markdown 문서. [link text](url) 쌍 추출 시도, greedy 먼저, 그 다음 lazy. 어느 쪽이 실제 원하는 거 주는지 확인. 이제 negated class 로 전환. 셋 다 비교.

Progress

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

댓글 0

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

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