(?:...) là Non-capturing Group: nhóm không capture (không lưu vào match groups, không tốn bộ nhớ, không ảnh hưởng numbering).
Tại sao cần Non-capturing Group?
- Cần grouping để apply quantifier (
*,+,?,|) nhưng không muốn capture nội dung. - Tăng hiệu năng nhẹ (không tạo group object).
- Giữ numbering group ổn định.
Ví dụ so sánh
import re
# CÓ capturing group
pattern_capture = r'(Set)(Value)?'
# Group 1: 'Set', Group 2: 'Value' hoặc None
# KHÔNG capturing group
pattern_nocapture = r'(?:Set)(Value)?'
# Group 1: 'Value' hoặc None (không có group cho 'Set')
Các trường hợp sử dụng phổ biến
1. Alternation không capture
# Chỉ muốn group cho color value, không muốn group cho từ 'color='
# SAI: tạo group thừa cho 'color='
r'color=(red|green|blue)'
# ĐÚNG: non-capturing group cho prefix
r'color=(?:red|green|blue)'
# Group 1 = 'red'/'green'/'blue'
2. Quantifier trên nhóm
# Khớp 3-6 chữ số, nhóm 3 chữ số một lần
r'(?:\d{3}){1,2}' # Khớp 3 hoặc 6 chữ số
# Group 1 không tồn tại
3. Tối ưu pattern phức tạp
# Parse date: chỉ capture year, month, day
r'(?P\d{4})-(?P\d{2})-(?P\d{2})'
# Non-capturing cho separator nếu cần phức tạp hơn
Tóm tắt
| Syntax | Tên | Capture? | Group number? |
|---|---|---|---|
(...) | Capturing Group | Có | Có (1, 2, 3...) |
(?:...) | Non-capturing Group | Không | Không |
(?P | Named Group | Có | Có (cả tên và số) |
(?P=name) | Named Backreference | Tham chiếu | Không tạo group mới |
Best practice: Mặc định dùng (?:...) cho mọi grouping trừ khi thực sự cần capture.