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

이름 붙은 그룹 — (?P<name>...)

~8 min · named-groups, readability

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

번호는 위치에 묶이지만 이름은 뜻에 묶여

패턴 중간에 괄호를 추가하면 뒤쪽 캡처 그룹의 번호가 모두 밀릴 수 있어. 이름 붙은 그룹을 사용하면 캡처의 위치 대신 yearemail처럼 값의 뜻으로 참조할 수 있지.

문법은 엔진 방언마다 달라

  • Python과 옛 PCRE: (?P<name>...)
  • .NET, PCRE, JavaScript: (?<name>...)
  • Python의 이름 역참조: (?P=name)
  • .NET과 PCRE의 이름 역참조: \k<name>

Python 내장 re에서 그룹을 선언할 때는 (?P<name>...)을 써야 해. (?<name>...)을 그대로 가져오면 컴파일 오류가 나.

이름을 붙이면 패턴과 호출 코드가 함께 읽혀

  1. m.group('year')m.group(1)보다 꺼내는 값의 뜻이 분명해.
  2. 앞쪽에 다른 그룹을 추가해도 이름 참조는 번호처럼 밀리지 않아.
  3. (?P<email>...)처럼 패턴 안에서도 캡처 목적을 설명할 수 있어.

따로 치러야 할 큰 비용은 없어

그룹의 뜻이 주변만 보고 즉시 드러나지 않는다면 이름을 붙여. 짧은 일회성 패턴에서는 번호도 충분하지만, 패턴이 길어지거나 호출 코드와 떨어져 있으면 이름이 유지보수 비용을 훨씬 줄여 줘.

Code

이름 붙은 그룹·python
import re

# Python 문법
pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m = re.match(pattern, '2026-05-04')
print(m.group('year'))   # '2026'
print(m.group('month'))  # '05'
print(m.groupdict())     # {'year': '2026', 'month': '05', 'day': '04'}

# (?<year>...) 형태는 JavaScript/.NET/PCRE 문법이야.
# Python re.compile(r'(?<year>\d{4})')는 re.error를 일으켜.

# 이름으로 역참조
re.findall(r'(?P<word>\w+)\s+(?P=word)', 'the the cat sat sat')
# ['the', 'sat']

# 이름만 읽어도 뜻이 드러나는 검증기
USER = re.compile(r'''
    ^
    (?P<localpart>[\w.+-]+)
    @
    (?P<domain>[\w-]+\.[\w.-]+)
    $
''', re.VERBOSE)
m = USER.match('hi@pippa.dev')
print(m.group('localpart'))  # 'hi'
print(m.group('domain'))     # 'pippa.dev'

External links

Exercise

캡처 그룹이 두세 개 들어간 기존 패턴을 이름 붙은 그룹으로 다시 작성해. 호출 코드도 m.group(1) 대신 m.group('year')처럼 바꾸고, 그룹 이름만 읽어도 꺼내는 값의 뜻이 드러나는지 확인해.

Progress

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

댓글 0

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

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