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

비캡처 그룹 — (?:...)

~6 min · non-capturing, performance

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

(?:...)는 값을 저장하지 않고 범위만 묶어

비캡처 그룹은 수량자와 선택의 범위를 정하는 일은 평범한 괄호와 똑같이 해. 다만 매칭한 텍스트를 번호 그룹에 담지 않아서 뒤쪽 그룹 번호를 차지하지 않아.

값이 필요 없을 때 비캡처 그룹을 쓰는 이유

  1. 의도가 바로 보여. (?:...)를 보면 이 괄호는 추출이 아니라 그룹화용이라는 걸 알 수 있어.
  2. 그룹 번호가 덜 흔들려. 비캡처 그룹을 중간에 추가하거나 지워도 기존 캡처 그룹의 번호는 바뀌지 않아.
  3. 불필요한 저장을 피할 수 있어. 성능 차이는 보통 작지만, 쓰지 않을 캡처를 만들 이유도 없지.

모든 괄호를 캡처 그룹으로 만들지는 마

나중에 실제로 꺼내 쓰거나 역참조할 값만 캡처해. 범위만 묶는 괄호까지 전부 캡처하면 결과 객체가 시끄러워지고, 패턴을 고칠 때 번호 참조도 함께 깨지기 쉬워져.

Code

비캡처 그룹 실전·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

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

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