2009-05-09 20 views
11

एक question that I answered मुझे सोच है? वहां किस तरह की दक्षता गारंटी है? कार्यान्वयन "मानक" है, या यह परिवर्तन के अधीन है?नियमित अभिव्यक्ति कार्यान्वयन विवरण

मैंने सोचा कि नियमित अभिव्यक्ति डीएफए के रूप में लागू की जाएगी, और इसलिए बहुत कुशल थे (इनपुट स्ट्रिंग के अधिकतम स्कैन की आवश्यकता होती है)। Laurence Gonsalves ने एक दिलचस्प मुद्दा उठाया कि सभी पायथन नियमित अभिव्यक्ति नियमित नहीं हैं। (उनका उदाहरण आर "(ए +) बी \ 1" है, जो किसी की संख्या, बी, और फिर पहले की तरह की संख्या से मेल खाता है)। यह स्पष्ट रूप से एक डीएफए के साथ लागू नहीं किया जा सकता है।

तो, दोहराने के लिए: पाइथन नियमित अभिव्यक्तियों के कार्यान्वयन विवरण और गारंटी क्या हैं?

यह भी अच्छा होगा अगर कोई कुछ प्रकार की स्पष्टीकरण (कार्यान्वयन के प्रकाश में) दे सकता है कि क्यों नियमित अभिव्यक्ति "बिल्ली | catdog" और "catdog | cat" स्ट्रिंग में विभिन्न खोज परिणामों का कारण बनती है " catdog ", जैसा कि question that I referenced before में उल्लिखित है।

+0

आज के नियमित अभिव्यक्ति कार्यान्वयन में नियमित अभिव्यक्तियों की क्लासिक परिभाषा की तुलना में कहीं अधिक सुविधाएं हैं। – Gumbo

+0

@ गम्बो: दरअसल वे करते हैं ... यह मेरे प्रश्न का कारण है। मैं एक विशिष्ट कार्यान्वयन के बारे में उत्सुक हूं क्योंकि डीएफए का उपयोग करने के लिए वास्तव में सुरक्षित नहीं है (इन अतिरिक्त सुविधाओं के कारण)। – Tom

+4

स्रोत का उपयोग करें, ल्यूक (http://svn.python.org/view/python/trunk/Lib/re.py?view=markup)। यह वास्तव में काफी अच्छी तरह से प्रलेखित लगता है। –

उत्तर

17

पायथन का पुनः मॉड्यूल PCRE पर आधारित था, लेकिन यह अपने स्वयं के कार्यान्वयन पर चला गया है।

यहां C code का लिंक है।

ऐसा प्रतीत होता है कि पुस्तकालय रिकर्सिव बैकट्रैकिंग पर आधारित है जब गलत पथ लिया गया है।

alt text

नियमित अभिव्यक्ति और पाठ आकार n
एक? n एक n मिलान एक n

ध्यान रखें कि इस ग्राफ सामान्य regex खोजों के प्रतिनिधि नहीं है।

http://swtch.com/~rsc/regexp/regexp1.html

+0

(मुझे पता है कि यह टिप्पणी देर हो चुकी है) मुझे आपकी व्याख्या पसंद है, सिवाय इसके कि मुझे नहीं लगता कि अंतिम भाग "बिल्ली | catdog" से मेल खाने के बारे में सही है। परिणामस्वरूप "बिल्ली | catdog" का उपयोग "बिल्ली" उत्पन्न करता है और परिणामस्वरूप "catdog | cat" "catdog" उत्पन्न करता है। मूल रूप से आदेश मायने रखता है। दो चीजें चल रही हैं। सबसे पहले, 'findall' केवल सभी गैर-ओवरलैपिंग मैचों को पाता है। तो आपको "बिल्ली" और "catdog" की उम्मीद नहीं करनी चाहिए। दूसरा, अगर मैं इसे कार्यान्वित कर रहा था, तो मुझे लगता है कि एनएफए को डीएफए में परिवर्तित किया जा सकता है और इसलिए आपके पास "सी -> ए -> * टी * -> डी -> ओ -> * जी *" होगा तारांकन एक अंतिम राज्य को दर्शाता है। – Tom

+0

(जारी ...): तो मूल रूप से, "टी" एक अंतिम स्थिति है, और मुझे लगता है कि खोज हमेशा "बिल्ली" वापस आनी चाहिए क्योंकि यह एक मैच खोजने के लिए जहां तक ​​जाना है। फिर भी, आपका उत्तर सहायक था, और मैं इसे स्वीकार करने जा रहा हूं (महीनों बाद :-)। – Tom

+0

हालांकि डीएफए एक सही दृष्टिकोण नहीं है। मिलान '[ab] * b [ab]^n' को डीएफए का उपयोग करके' ओ (2^एन) 'मेमोरी की आवश्यकता होती है, लेकिन एनएफए का उपयोग करके रैखिक समय और मेमोरी में किया जा सकता है। –

6

नहीं "दक्षता की गारंटी देता है" अजगर आर ई भाषा के किसी अन्य भाग पर से किसी भी अधिक पर कर रहे हैं (सी ++ के मानक पुस्तकालय केवल बड़े पैमाने पर भाषा मानक मैं जानता हूँ कि इस तरह के मानकों को स्थापित करने की कोशिश करता है - लेकिन सी ++ में भी कोई मानक नहीं है, यह बताते हुए कि, दो चींटियों को गुणा करने के लिए निरंतर समय लेना चाहिए, या ऐसा कुछ भी); न ही कोई गारंटी है कि बड़े अनुकूलन किसी भी समय लागू नहीं होंगे।

आज, एफ। लुंड (मूल रूप से पायथन के वर्तमान आरई मॉड्यूल को लागू करने के लिए ज़िम्मेदार), ने पिकॉन इटालिया में अनलाडेन निगल प्रस्तुत करते हुए उल्लेख किया कि वे जिस मार्ग का अन्वेषण करेंगे, वह नियमित रूप से एलएलवीएम इंटरमीडिएट कोड को नियमित अभिव्यक्तियों को संकलित करना है (एक विज्ञापन-हाटक रनटाइम द्वारा व्याख्या किए जाने वाले अपने बाइटकोड स्वाद के बजाए) - चूंकि साधारण पायथन कोड को एलएलवीएम (अनलडेन निगल की जल्द से जल्द रिलीज में) में संकलित किया जा रहा है, इसलिए एक आरई और इसके आसपास के पायथन कोड तब हो सकते हैं कई बार कई आक्रामक तरीकों से भी एक साथ अनुकूलित किया जा सकता है। मुझे संदेह है कि ऐसा कुछ भी "उत्पादन-तैयार" के करीब कहीं भी होगा, हालांकि ;-)।

1

Matching regular expressions with backreferences is NP-hard, जो कम से कम NP-Complete जितना कठिन है। इसका मूल रूप से मतलब है कि यह किसी भी समस्या के मुकाबले जितना मुश्किल हो सकता है, और अधिकांश कंप्यूटर वैज्ञानिकों का मानना ​​है कि इसे सबसे खराब मामले में घातीय समय की आवश्यकता हो सकती है।यदि आप बहुपद समय में ऐसे "नियमित" अभिव्यक्तियों (जो वास्तव में तकनीकी अर्थ में नहीं हैं) से मेल खाते हैं, तो आप a million bucks जीत सकते हैं।

संबंधित मुद्दे