Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Ý nghĩa của (?:...) - Non-capturing Group trong Python Regex

(?:...) 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

SyntaxTênCapture?Group number?
(...)Capturing GroupCóCó (1, 2, 3...)
(?:...)Non-capturing GroupKhôngKhông
(?P...)Named GroupCóCó (cả tên và số)
(?P=name)Named BackreferenceTham chiếuKhô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.