मैंने एक ऐसे प्रोग्राम पर काम किया है जो उपयोगकर्ताओं को अपने स्वयं के रेगेक्स में प्रवेश करने की अनुमति देता है और आप सही हैं - वे रेगेक्स में प्रवेश कर सकते हैं (और करते हैं) जो खत्म होने में लंबा समय ले सकता है - कभी-कभी ब्रह्मांड के जीवनकाल की तुलना में अधिक लंबा होता है। इससे भी बदतर बात यह है कि रेगेक्स पाइथन को प्रोसेस करते समय जीआईएल होता है, इसलिए यह न केवल थ्रेड को रेगेक्स चला रहा है, बल्कि पूरे कार्यक्रम को लटकाएगा।
regex की लंबाई सीमित काम नहीं करेगा, क्योंकि समस्या उलटे पांव लौटने से किया जाता है। उदाहरण के लिए, लंबाई एन की एक स्ट्रिंग पर regex r"(\S+)+x"
से मिलान करना जिसमें "x" नहीं है, 2 ** एन बार बैकट्रैक होगा। अपने सिस्टम पर इस "a"*21
के खिलाफ मैच के लिए एक दूसरे के बारे में लेता है और समय प्रत्येक अतिरिक्त चरित्र के लिए दोगुना हो जाता है, तो 100 अक्षरों की स्ट्रिंग लगभग 19167393131891000 साल लग जाएगा पूरा करने के लिए (यह एक अनुमान है, मैं इसे समय समाप्त हो गया है)।
अधिक जानकारी के लिए ओ रेली पुस्तक "रेगुलर एक्सप्रेशन मास्टरिंग" पढ़ा - इस प्रदर्शन पर अध्याय की एक जोड़ी है।
संपादित इस हम एक regex विश्लेषण समारोह है कि पकड़ने और अधिक स्पष्ट पतित मामलों में से कुछ को अस्वीकार करने की कोशिश की लिखा दौर प्राप्त करने के लिए, लेकिन यह उन सभी को प्राप्त करने के लिए असंभव है।
एक और बात हम फिर से मॉड्यूल पैचिंग गया था कि क्या इसे कई बार backtracks एक अपवाद को बढ़ाने के लिए देखा। यह संभव है, लेकिन पाइथन सी स्रोत और recompiling बदलने की आवश्यकता है, तो पोर्टेबल नहीं है। हमने पाइथन तारों के खिलाफ मिलान करते समय जीआईएल को रिहा करने के लिए एक पैच भी प्रस्तुत किया, लेकिन मुझे नहीं लगता कि इसे कोर में स्वीकार किया गया था (पायथन केवल जीआईएल रखता है क्योंकि रेगेक्स को परिवर्तनीय बफर के खिलाफ चलाया जा सकता है)।
स्रोत
2010-01-04 09:48:05
+1 "(यह एक अनुमान है, मैंने इसे समय नहीं दिया है)" –
मुझे लगता है कि मैं एक और प्रक्रिया को जन्म दे सकता हूं और इसे बहुत लंबे समय बाद बाहर निकाल सकता हूं? – Skeletron
स्पॉन्गिंग और हत्या काम करेगी, लेकिन प्रत्येक मैच को चलाने के लिए काफी ओवरहेड जोड़ें। चाहे वह भुगतान करने के लिए स्वीकार्य मूल्य है आप पर निर्भर है। –