Tôi đã làm việc trên một chương trình cho phép người dùng nhập regex của riêng mình và bạn đúng - họ có thể (và làm) nhập regex có thể mất nhiều thời gian để hoàn thành - đôi khi dài hơn tuổi thọ của vũ trụ. Điều gì là tồi tệ hơn, trong khi xử lý một regex Python giữ GIL, do đó, nó sẽ không chỉ treo thread đang chạy regex, nhưng toàn bộ chương trình.
Hạn chế độ dài của regex sẽ không hoạt động, vì sự cố xảy ra ngược dòng. Ví dụ: khớp với regex r"(\S+)+x"
trên một chuỗi có độ dài N không chứa dấu "x" sẽ quay lại 2 ** N lần. Trên hệ thống của tôi mất khoảng một giây để so khớp với "a"*21
và thời gian tăng gấp đôi cho mỗi ký tự bổ sung, do đó, một chuỗi gồm 100 ký tự sẽ mất khoảng 19167393131891000 năm để hoàn thành (đây là ước tính, tôi chưa hẹn giờ).
Để biết thêm thông tin, hãy đọc cuốn sách O'Reilly "Làm chủ biểu thức chính quy" - điều này có một vài chương về hiệu suất.
chỉnh sửa Để có được vòng này chúng tôi đã viết một hàm regex phân tích đã cố gắng để bắt và từ chối một số trường hợp thoái hóa rõ ràng hơn, nhưng nó là không thể để có được tất cả trong số họ.
Một điều khác chúng tôi đã xem xét là vá mô-đun lại để tăng ngoại lệ nếu nó lùi lại quá nhiều lần. Điều này là có thể, nhưng đòi hỏi phải thay đổi nguồn Python C và biên dịch lại, do đó, không phải là di động. Chúng tôi cũng đã gửi một bản vá để giải phóng GIL khi kết hợp với chuỗi python, nhưng tôi không nghĩ rằng nó được chấp nhận vào lõi (python chỉ giữ GIL vì regex có thể chạy với bộ đệm có thể thay đổi).
Nguồn
2010-01-04 09:48:05
+1 cho "(đây là ước tính, tôi chưa hẹn giờ)" –
Tôi đoán tôi có thể sinh ra một quá trình khác và sau đó giết nó nếu nó hết sau quá lâu? – Skeletron
sinh sản và giết chóc sẽ hoạt động, nhưng thêm chi phí đáng kể để chạy mỗi trận đấu. Cho dù đó là một mức giá chấp nhận được thanh toán là tùy thuộc vào bạn. –