본문 바로가기
C.W.K.
Stream
Lesson 08 of 12 · published

탐욕적 수량자와 게으른 수량자 — 언제 중요한가

~8 min · greedy, lazy, decision

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

나머지 패턴이 한 위치에서만 맞으면 결과도 같아

\d+abc\d+?abc1234abc에 적용하면 둘 다 같은 문자열을 찾을 수 있어. 뒤의 abc가 들어갈 자리가 하나뿐이라 소비량을 달리 시도해도 최종 경계는 같기 때문이야.

차이는 닫는 표식이나 다음 요소가 여러 위치에 나타날 때 드러나. 탐욕적 수량자는 먼저 많이 잡고 뒤로 물러나며, 게으른 수량자는 먼저 적게 잡고 앞으로 늘려 가.

입력 모양에 맞춰 선택해

표식 사이를 추출한다면 첫 닫는 표식에서 멈추는 게으른 수량자나 그 표식을 제외하는 문자 클래스를 먼저 살펴봐.

전화번호나 날짜처럼 모양이 고정돼 있다면 탐욕적 수량자로도 경계가 흔들리지 않는 경우가 많아. 실제 정상 입력과 오류 입력을 함께 대입해서 확인해.

긴 텍스트에서 일부를 검색한다면 어느 경계를 원하느냐를 먼저 정해야 해. 탐욕적이라는 이유만으로 값이 더 정확해지는 것도, 게으르다는 이유만으로 더 안전해지는 것도 아니야.

모르겠다면 기본 동작에서 시작해

우선 탐욕적 수량자로 패턴을 만들고 대표 입력에서 잡히는 범위를 확인해. 너무 멀리 잡으면 게으른 수량자나 부정형 문자 클래스로 바꾸고, 바뀐 경계가 요구사항과 맞는지 다시 시험해.

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

여러 줄 Markdown 문서에서 [link text](url) 모양을 추출해. 먼저 탐욕적 수량자로 시도하고, 이어서 게으른 수량자와 부정형 문자 클래스로 바꿔 봐. 세 결과를 비교해서 어느 패턴이 원하는 링크 경계에서 멈추는지 설명해.

Progress

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

댓글 0

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

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