Kèm theo regex bạn muốn lặp lại trong dấu ngoặc đơn. Ví dụ, nếu bạn muốn 5 lần lặp lại của ABC
:
(ABC){5}
Hoặc nếu bạn muốn bất kỳ số lần lặp lại (0 trở lên):
(ABC)*
Hoặc một hoặc nhiều lần lặp lại:
(ABC)+
chỉnh sửa để phản hồi cập nhật
Dấu ngoặc đơn trong biểu thức chính quy làm hai việc; chúng nhóm lại với nhau một chuỗi các mục trong một biểu thức chính quy, để bạn có thể áp dụng toán tử cho toàn bộ chuỗi thay vì chỉ mục cuối cùng và chúng nắm bắt nội dung của nhóm đó để bạn có thể trích xuất chuỗi con phù hợp với biểu thức con đó trong regex.
Bạn có thể lồng dấu ngoặc đơn; chúng được tính từ lần mở đầu tiên. Ví dụ:
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(0)
'123 ABCDEF'
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(1)
'ABCDEF'
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(2)
'DEF'
Nếu bạn muốn tránh chụp khi bạn đang nhóm, bạn có thể sử dụng (?:
. Điều này có thể hữu ích nếu bạn không muốn các dấu ngoặc đơn mà bạn chỉ sử dụng để nhóm lại một chuỗi với mục đích áp dụng toán tử để thay đổi việc đánh số các kết quả phù hợp của bạn. Nó cũng nhanh hơn.
>>> re.search('[0-9]* (?:ABC(...))', '123 ABCDEF 456').group(1)
'DEF'
Vì vậy, để trả lời cập nhật của bạn, có, bạn có thể sử dụng các nhóm chụp lồng nhau, hoặc thậm chí tránh chụp với nhóm nội tại tất cả:
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(1)
'ABCABCABCABCABC'
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(2)
'DEF'
Nguồn
2010-09-02 20:32:11
Tôi sẽ sử dụng + tại đây thay vì *, vì * sẽ khớp với 0 lần xuất hiện (ABC). – Robusto
(ABC) {3,5} cũng cho một loạt các lần lặp lại –
Oh duh. Tôi đã suy nghĩ() chỉ được sử dụng cho các công cụ chụp cho một số lý do. Nhưng điều đó có ý nghĩa. Được chọn là lần đầu tiên – Falmarri