2016-02-28 18 views
7
In [29]: re.findall("([abc])+","abc") 
Out[29]: ['c'] 

In [30]: re.findall("[abc]+","abc") 
Out[30]: ['abc'] 

समूहबद्ध व्यक्ति द्वारा भ्रमित। यह कैसे फर्क पड़ता है?दो नियमित अभिव्यक्तियों के बीच अंतर: [एबीसी] + और ([एबीसी]) +

+0

'' re.findall' re.findall के बाद से विश्लेषण में एक रिंच फेंक ("[abc] +", "abc") 'वैसे भी कोष्टक के बिना कैप्चर (पूरा मैच तो पता चलता ...) फिर से प्रयास करें' .search (आर '([एबीसी]) +', 'एबीसी') समूह (1) 'और' re.search (आर '([एबीसी] +)', 'एबीसी')। समूह (1) ' – dawg

उत्तर

8

दो चीजें हैं जिन्हें यहां समझाया जाना चाहिए: मात्राबद्ध समूहों का व्यवहार, और findall() विधि का डिज़ाइन।

आपके पहले उदाहरण में, [abc]a से मेल खाता है, जो समूह # 1 में कैप्चर किया गया है। फिर यह b से मेल खाता है और इसे a पर ओवरराइट करते हुए समूह # 1 में कैप्चर करता है।फिर फिर c के साथ, और मैच के अंत में समूह # 1 में यही शेष है।

लेकिन यह पूरी स्ट्रिंग से मेल नहीं करता है। यदि आप search() या finditer() का उपयोग कर रहे थे, तो आप MatchObject को देख पाएंगे और देखेंगे कि group(0) में abc और group(1)c शामिल हैं। लेकिन findall() स्ट्रिंग्स लौटाता है, मैचऑब्जेक्ट्स नहीं। यदि कोई समूह नहीं है, तो यह समग्र मैचों की एक सूची देता है; यदि समूह हैं, तो सूची में सभी कैप्चर हैं, लेकिन कुल मिलान नहीं है।

तो अपने regexes के दोनों पूरी स्ट्रिंग मिलान कर रहे हैं, लेकिन पहले एक भी कब्जा करने और व्यक्तिगत रूप से हर किरदार को त्यागकर जाता है (जो थोड़े व्यर्थ है)। यह केवल findall() का अनपेक्षित व्यवहार है जो ऐसा लगता है कि आपको अलग-अलग परिणाम मिल रहे हैं।

-3

ग्रुपिंग सिर्फ अलग वरीयता देता है।

([abc])+ => चयन से एक खोजें। एक या अधिक से मेल खा सकते हैं। यह एक और सभी स्थितियों को पूरा करता है क्योंकि + 1 या उससे अधिक का मतलब है। यह रेगेक्स को दो चरणों में तोड़ देता है।

जबकि समूह रहित व्यक्ति को पूरी तरह से माना जाता है।

+3

यह स्पष्टीकरण पूरी तरह से गलत है। इसमें कोई शॉर्ट-सर्किटिंग शामिल नहीं है। यदि यह स्पष्टीकरण सही था, तो पहला 'खोज' '['c']' के बजाय '['a'] 'वापस कर दिया होगा। – user2357112

+0

शॉर्ट-सर्किट गलत शब्द हो सकता है। सभी शर्तों को पूरा कर रहे हैं। - –

+2

को प्रतिबिंबित करने के लिए भाषा बदल दी गई है, यह गलत शब्द होने के कारण "शॉर्ट-सर्किट" नहीं है। काम पर तंत्र आपके द्वारा वर्णित तरीके से काम नहीं करता है। एक और उदाहरण के रूप में, '^ ([एबीसी]) + $ '' abc'' 'नहीं देता है; [यह अभी भी '['सी']'] प्रदान करता है (http://ideone.com/Mj9Wh2)। – user2357112

0

इनपुट "abc"

[abc] 

मैच एक भी चरित्र => "एक"

[abc]+ 

+ एक और असीमित बार बीच संभव => "abc" के रूप में रूप में कई बार

([abc]) 

कैप्चरिंग समूह ([abc]) => "एक"

([abc])+ 

+ एक दोहराया कब्जा समूह केवल कब्जा पिछले यात्रा => "सी"

7

पहला उदाहरण आप एक दोहराया कब्जा कर लिया समूह है जो केवल पिछले यात्रा पर कब्जा है में। यहां c

([abc])+ 

Regular expression visualization

Debuggex Demo

दूसरे उदाहरण आप सूची एक और असीमित समय में एक एकल वर्ण मिलान कर रहे हैं।

[abc]+ 

Regular expression visualization

Debuggex Demo

2

यहाँ जिस तरह से मैं इसके बारे में सोचते हैं है। ([abc])+ एक कब्जे वाले समूह को दोहराने का प्रयास कर रहा है। जब आप कैप्चर समूह के बाद "+" का उपयोग करते हैं, तो इसका मतलब यह नहीं है कि आपको दो कैप्चर किए गए समूह मिलेंगे। कम से कम पाइथन के रेगेक्स और अधिक कार्यान्वयन के लिए क्या हो रहा है, यह है कि "+" कैप्चर ग्रुप में केवल अंतिम मैच होता है जब तक "+" पुनरावृत्ति को बल देता है।

यदि आप दोहराए गए अभिव्यक्ति को कैप्चर करना चाहते हैं, तो आपको "(...)" और "+" के क्रम को उलट करने की आवश्यकता है, उदा। ([abc])+ के बजाय ([abc]+) का उपयोग करें।

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