Tôi nghĩ bạn hiểu nhầm khái niệm "nhóm không bắt giữ". Văn bản được so khớp bởi nhóm không bắt giữ vẫn trở thành một phần của kết hợp regex tổng thể.
Cả regex (?:aaa)(_bbb)
và regex (aaa)(_bbb)
trả lại aaa_bbb
làm đối sánh chung. Sự khác biệt là regex đầu tiên có một nhóm chụp trả về _bbb
làm đối sánh của nó, trong khi regex thứ hai có hai nhóm chụp trả lại aaa
và _bbb
làm các kết quả phù hợp tương ứng. Trong mã Python của bạn, để có được _bbb
, bạn cần sử dụng group(1)
với regex đầu tiên và group(2)
với regex thứ hai.
Lợi ích chính của nhóm không chụp là bạn có thể thêm chúng vào regex mà không làm xáo trộn số lượng nhóm chụp trong regex. Họ cũng cung cấp (hơi) hiệu suất tốt hơn như động cơ regex không phải theo dõi các văn bản phù hợp bởi các nhóm không bắt.
Nếu bạn thực sự muốn loại trừ aaa
khỏi kết hợp regex chung thì bạn cần sử dụng lookaround. Trong trường hợp này, lookbehind tích cực hiện các trick: (?<=aaa)_bbb
. Với regex này, group()
trả lại _bbb
bằng Python. Không cần nhóm chụp.
Đề xuất của tôi là nếu bạn có khả năng sử dụng các nhóm chụp để tham gia vào trận đấu regex, hãy sử dụng phương pháp đó thay vì xem xét kỹ.
Nguồn
2010-04-24 03:43:52
tuyệt vời, cảm ơn bạn đã chỉnh sửa và trả lời chỉ ra khái niệm về nhóm không bắt giữ –