Dấu ngoặc không lưu giữ trong biểu thức chính quy Python
Dấu ngoặc ( ) thực hiện hai chức năng -
nhóm các ký tự và chức năng nhóm bắt giữ (capturing group). Vậy
phải làm gì nếu cần nhóm, nhưng
không muốn bắt giữ vào nhóm? Để giải quyết vấn đề như vậy
người ta đã nghĩ ra dấu ngoặc không lưu giữ
(?: ) - chúng nhóm,
nhưng không bắt giữ vào nhóm.
Ví dụ
Trong ví dụ sau, cặp ngoặc đầu tiên chúng ta cần để nhóm, còn cặp thứ hai - để bắt giữ. Tuy nhiên, cả hai cặp ngoặc đều lưu giữ dữ liệu vào nhóm bắt giữ:
txt = 'abab123'
res = re.search('(ab)+([1-9]+)', txt)
Kết quả trong các nhóm bắt giữ của chúng ta sẽ là như sau:
print(res[0]) # sẽ in ra 'abab123'
print(res[1]) # sẽ in ra 'ab'
print(res[2]) # sẽ in ra '123'
Ví dụ
Hãy làm sao để cặp ngoặc đầu tiên chỉ nhóm, nhưng không bắt giữ vào nhóm:
txt = 'abab123'
res = re.search('(?:ab)+([1-9]+)', txt)
Kết quả trong nhóm bắt giữ đầu tiên sẽ là số của chúng ta:
print(res[1]) # sẽ in ra '123'