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

중첩 그룹

~6 min · nested, numbering

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

그룹 안에 다른 그룹을 넣을 수 있어

바깥 그룹은 안쪽 표현 전체가 매칭한 값을 담고, 안쪽 그룹은 각자 맡은 조각을 따로 담아. 같은 입력을 여러 크기로 꺼내야 할 때 유용해.

((\d+)-(\d+))42-1138에 적용하면 다음 세 값이 생겨.

  • 그룹 1은 바깥 괄호가 잡은 42-1138이고
  • 그룹 2는 첫 안쪽 괄호가 잡은 42이고
  • 그룹 3은 둘째 안쪽 괄호가 잡은 1138이야.

번호는 닫히는 순서가 아니라 열리는 순서로 붙어

엔진은 패턴을 왼쪽에서 오른쪽으로 읽으며 여는 괄호를 만날 때마다 다음 번호를 줘. 그래서 (a(b)c)(d)에서는 가장 먼저 열린 바깥 괄호가 그룹 1, 그 안의 (b)가 그룹 2, 마지막 (d)가 그룹 3이야.

중첩이 깊어지면 이름으로 빠져나와

번호만 쓰면 괄호 하나를 추가했을 때 호출 코드와 역참조를 줄줄이 고쳐야 할 수 있어. 의미 있는 캡처에는 이름을 붙이고, 범위만 묶는 괄호에는 비캡처 그룹을 쓰면 번호에 의존하는 부분을 줄일 수 있어.

Code

중첩 그룹·python
import re

# 외부가 전체 캡처, 내부가 조각 캡처
m = re.match(r'((\d+)-(\d+))', '42-1138')
m.group(0)  # '42-1138' (전체 매칭)
m.group(1)  # '42-1138' (외부)
m.group(2)  # '42'
m.group(3)  # '1138'

# 번호가 여는 괄호 순서 따라
m = re.match(r'(a(b)c)(d)', 'abcd')
m.group(1)  # 'abc'
m.group(2)  # 'b'
m.group(3)  # 'd'

# Named 그룹이 중첩 명확히 살아남음
DATE = re.compile(r'(?P<full>(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2}))')
m = DATE.match('2026-05-04')
m.group('full')   # '2026-05-04'
m.group('year')   # '2026'
m.group('month')  # '05'
m.group('day')    # '04'

External links

Exercise

그룹 1에는 이메일 주소 전체를, 그룹 2에는 도메인만 담는 중첩 그룹 패턴을 작성해. m.group(1)m.group(2)가 각각 기대한 값을 돌려주는지 실제 주소로 시험해.

Progress

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

댓글 0

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

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