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

Non-Capturing 그룹 — (?:...)

~6 min · non-capturing, performance

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

캡처 슬롯 할당 없이 그룹화

(?:...) 는 그룹화 목적엔 (...) 처럼 동작 — quantifier 와 alternation 똑같이 동작 — 하지만 매칭된 텍스트를 번호 그룹에 캡처하지 않음. 매칭은 존재; 그냥 슬롯이 없음.

왜 굳이

값 필요 없을 때 non-capturing 선호 이유 셋:

  1. 명확성. 읽는 사람이 (?:...) 보고 즉시 "이건 그룹화, 추출 아님" 알아. 캡처 그룹은 "이거 뭐야?" 질문 부름.
  2. 그룹 번호 안정성. Non-capturing 그룹 추가/제거해도 다른 캡처 그룹 번호 안 바뀜. 순수 (...) 면 패턴 모든 변경이 모든 다운스트림 참조 번호 바꿀 수 있음.
  3. 약간 성능. 캡처 슬롯 할당 없음. 작은 이득, 무료.

'혹시 모르니 다 캡처' 안티 패턴

입문자는 모든 그룹 반사적으로 캡처, 그 다음 캡처 대부분 안 씀. 결과: 노이즈 코드, fragile 그룹 번호, 약간 느린 매칭. 실제 쓸 거만 캡처; 나머지는 non-capture.

Code

Non-capturing 그룹 실전·python
import re

# 캡처 — group 1 에 'http://example.com' 줌
re.findall(r'((?:https?://)[\w.-]+)', 'visit http://a.com and https://b.com')
# ['http://a.com', 'https://b.com']

# 같은 패턴, 모두 캡처 — 프로토콜용 추가 캡처 슬롯
re.findall(r'((https?://)[\w.-]+)', 'visit http://a.com and https://b.com')
# [('http://a.com', 'http://'), ('https://b.com', 'https://')]
# 이제 매칭당 튜플, URL 만 원했는데

# Alternation 위한 non-capturing
re.findall(r'(?:cat|dog|fish)', 'cat fish dog cat')
# ['cat', 'fish', 'dog', 'cat']  — 깨끗한 리스트

# 캡처 alternation — 노이즈 추가
re.findall(r'(cat|dog|fish)', 'cat fish dog cat')
# ['cat', 'fish', 'dog', 'cat']  — 같아 보이지만 group 1 할당됨

External links

Exercise

본인 코드에 여러 괄호 있는 정규식 찾기. 실제 안 쓰는 모든 그룹을 (?:...) 로 변환. 테스트 다시 돌리기. 동작 동일, 패턴 더 깨끗하게 읽혀야.

Progress

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

댓글 0

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

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