2012-11-27 13 views
26

रूबी के नियमित अभिव्यक्तियों में परमाणु समूह (?>regexp) नामक एक विशेषता है, here का वर्णन किया गया है, क्या पाइथन के re मॉड्यूल में कोई समतुल्य है?क्या पाइथन नियमित अभिव्यक्ति रूबी के परमाणु समूह के बराबर है?

उत्तर

40

अजगर सीधे इस सुविधा का समर्थन नहीं करता है, लेकिन आप एक शून्य चौड़ाई अग्रदर्शी ज़ोर ((?=RE)) है, जो के साथ मौजूदा बिंदु से मेल खाता का उपयोग करके इसे का अनुकरण कर सकते हैं वही अर्थशास्त्र जो आप चाहते हैं, लुकहेड के अंदर एक नामित समूह ((?P<name>RE)) डालें, और उसके बाद एक नामित बैकरेफर ((?P=name)) का उपयोग करके शून्य-चौड़ाई वाला दावा मिलान करने के लिए बिल्कुल सही मिलान करें। एक साथ संयुक्त, यह आपको एक अतिरिक्त मिलान समूह, और बहुत सारे वाक्यविन्यास बनाने की लागत पर, वही अर्थशास्त्र देता है।

उदाहरण के लिए, लिंक आपके द्वारा दी गई

/"(?>.*)"/.match('"Quote"') #=> nil 

की रूबी उदाहरण देता है हम अनुकरण कर सकते हैं कि अजगर में जैसे:

re.search(r'"(?=(?P<tmp>.*))(?P=tmp)"', '"Quote"') # => None 

हम दिखा सकते हैं कि मैं कुछ उपयोगी कर रहा हूँ और न केवल लाइन शोर को फेंकना, क्योंकि अगर हम इसे बदलते हैं तो आंतरिक समूह अंतिम " नहीं खाता है, यह अभी भी मेल खाता है:

re.search(r'"(?=(?P<tmp>[A-Za-z]*))(?P=tmp)"', '"Quote"').groupdict() 
# => {'tmp': 'Quote'} 

तुम भी गुमनाम समूहों और संख्यात्मक backreferences उपयोग कर सकते हैं, लेकिन इस लाइन-शोर के बहुत पूरा हो जाता है:

re.search(r'"(?=(.*))\1"', '"Quote"') # => None 

(पूर्ण प्रकटीकरण: मैं पर्ल के perlre प्रलेखन, जिसके लिए प्रलेखन के तहत यह उल्लेख से इस चाल सीखा (?>...)।)

सही अर्थशास्त्र के अलावा, इसमें उचित प्रदर्शन गुण भी हैं। हम बंदरगाह perlre से बाहर एक उदाहरण हैं:

[[email protected]:~/tmp]$ python re.py 
96.0800571442 
7.41481781006e-05 

कौन सा केवल ज्यादा नाटकीय हो जाता है के रूप में हम खोज स्ट्रिंग की लंबाई का विस्तार:

[[email protected]:~/tmp]$ cat re.py 
import re 
import timeit 


re_1 = re.compile(r'''\(
          (
          [^()]+   # x+ 
          | 
          \([^()]* \) 
          )+ 
         \) 
        ''', re.X) 
re_2 = re.compile(r'''\(
          (
          (?=(?P<tmp>[^()]+))(?P=tmp) # Emulate (?> x+) 
          | 
          \([^()]* \) 
          )+ 
         \)''', re.X) 

print timeit.timeit("re_1.search('((()' + 'a' * 25)", 
        setup = "from __main__ import re_1", 
        number = 10) 

print timeit.timeit("re_2.search('((()' + 'a' * 25)", 
        setup = "from __main__ import re_2", 
        number = 10) 

हम एक नाटकीय सुधार को देखते हैं।

-2

http://docs.python.org/2/library/re.html#regular-expression-syntax

(? पी < नाम> ...)

नियमित कोष्ठकों की तरह, लेकिन सबस्ट्रिंग समूह के अनुरूप प्रतीकात्मक समूह नाम के माध्यम से नियमित अभिव्यक्ति के बाकी के भीतर पहुंचा जा सकता है से नाम। समूह के नाम वैध पायथन पहचानकर्ता होना चाहिए, और प्रत्येक समूह का नाम नियमित अभिव्यक्ति के भीतर केवल एक बार परिभाषित किया जाना चाहिए। एक प्रतीकात्मक समूह भी एक क्रमांकित समूह है, जैसे समूह का नाम नहीं था। तो नीचे दिए गए उदाहरण में आईडी नामक समूह को भी क्रमांकित समूह के रूप में संदर्भित किया जा सकता है।

उदाहरण के लिए, यदि पैटर्न (? पी [ए-जेए-जेड _] \ डब्ल्यू *) है, तो समूह को संदर्भित किया जा सकता है मिलान वस्तुओं के तरीकों के लिए तर्कों में इसके नाम से, जैसे m.group ('id') या m.end ('id'), और नियमित रूप से अभिव्यक्ति में नाम से ((? पी = आईडी) का उपयोग करके) और प्रतिस्थापन पाठ .sub() को दिया गया है (\ g का उपयोग कर)।

(? पी = नाम)

Matches whatever text was matched by the earlier group named name. 
+2

नामांकित मैचों परमाणु समूह के समान नहीं हैं। –

+0

आह। क्षमा करें, दस्तावेज़ पृष्ठ को गलत पढ़ें। नहीं, मुझे विश्वास नहीं है कि मैंने कभी उस पायथन में सुना है। –

10

this table के अनुसार, उत्तर नहीं है। एक RFE अजगर 3 में जोड़ने के लिए बनाया गया था, लेकिन नए regex मॉड्यूल, का समर्थन करता है जो इसे के पक्ष में अस्वीकृत किया गया था:

>>> import regex 
>>> regex.match('"(?>.*)"', '"Quote"') 
>>> regex.match('"(.*)"', '"Quote"') 
<_regex.Match object at 0x00C6F058> 

नोट: regex अजगर 2 के लिए भी उपलब्ध है

+1

आपके द्वारा लिंक किया गया 'रेगेक्स' मॉड्यूल एक ही रेगेक्स मॉड्यूल है जिसे आपने लिंक किया है, जो कि आपके द्वारा लिंक किया गया है, Python 3.3 stdlib – jfs

+0

@ J.F.Sebastian ओह, ठीक है! मैंने सोचा कि पाइथन 3 अभी भी 'पुनः' मॉड्यूल का उपयोग करता है, क्योंकि मैंने कभी भी पायथन 2 का उपयोग किया था, मुझे यकीन नहीं था, और माना जाता है कि यह उसी मॉड्यूल को संदर्भित करता है। (* संपादित करें: * एनवीएम ने देखा कि क्या गलत था: मैं [यह आरएफई] (http://bugs.python.org/issue433030) देख रहा था, जिसे मैंने उत्तर में वर्णित एक के डुप्लिकेट के रूप में बंद कर दिया था मैं इसे अपडेट करूंगा) – mgibsonbr

+0

अब, आपने लिंक बदल दिया है, मेरी पिछली टिप्पणी समझ में नहीं आती है। रिकॉर्ड के लिए लिंक http://pypi.python.org/pypi/regex और http://bugs.python.org/issue2636 थे – jfs

0

यह प्रतीत होता है नहीं।

http://www.regular-expressions.info/atomic.html

परमाणु समूह JGsoft स्वाद, जावा, PCRE, .नेट, पर्ल और रूबी सहित सबसे आधुनिक नियमित अभिव्यक्ति जायके, द्वारा समर्थित है।

आप गैर पर कब्जा समूहों, (?:RE) का उपयोग करके उनमें से गैर कैप्चरिंग सत्ता का अनुकरण कर सकते हैं, लेकिन अगर मैं यह सही पढ़ रहा हूँ, कि अभी भी आप अनुकूलन लाभ नहीं देंगे।

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