2012-02-19 12 views
5

यहाँ यह है:पुनः मॉड्यूल में समूह और समूह के बीच क्या अंतर है?

import re 
>>>s = 'abc -j k -l m' 
>>>m = re.search('-\w+ \w+', s) 
>>>m.groups() 
() 
>>> m.group(0) 
'-j k' 

क्यों groups() मुझे कुछ भी नहीं देता है, लेकिन group(0) कुछ पैदावार? अंतर क्या है?

>>>m = re.search('(-\w+ \w+)+', s) 
>>>m.groups() 
('-j k',) 

क्यों search नहीं दे सकता:

ऊपर का पालन

कोड के रूप में इस प्रकार है

>>>re.findall('(-\w+ \w+)', s) 
['-j k', '-l m', '-n o'] 

findall मुझे सभी -\w+ \w+ सबस्ट्रिंग प्राप्त कर सकते हैं, लेकिन इस पर ध्यान है मुझे सब सबस्ट्रिंग्स?

ऊपर का पालन करें फिर

तो s = 'abc -j k -l m -k o, और

>>>m = re.search(r'(-\w+ \w+)+', s) 
>>>m.groups() 
('-l m ',)  # why just one substring? 
>>>m.group(0) 
'-j k -l m ' # as I expected 
+0

अधिकांश नियमित अभिव्यक्ति स्वादों में मानक व्यवहार * समूह की किसी भी सामग्री को प्रतिस्थापित करना है, जब इसे प्रत्येक पास के लिए अतिरिक्त समूहों को उत्पन्न करने के बजाय एक से अधिक बार कब्जा कर लिया जाता है। यदि आप उन सभी को कैप्चर करना चाहते हैं तो आपको बार-बार खोजना होगा। 're.findall()' आपके मामले में उपयोगी होना चाहिए। – danielkza

+0

@ डैनियलल्ज़ा, लेकिन क्यों 'समूह()' ने मुझे '-l m' '' ''-j k'' क्यों दिया? – Alcott

+1

पुनरावृत्ति का पहला पास '-j k' से मेल खाता है। दूसरा पास तब संग्रहित मैच को एक नए, '-l m' के साथ ओवरराइट करता है। यदि वहां और भी मैचों का पालन किया गया था, तो आखिरी बार संग्रहित किया जाएगा। मैं आपको नहीं बता सका * क्यों * यह व्यवहार मौजूद है, लेकिन यह लगभग सभी नियमित अभिव्यक्ति स्वादों में मौजूद है। यदि आप सभी मैचों को कैप्चर करना चाहते हैं तो आपको पैटर्न को कई बार लागू करना होगा। – danielkza

उत्तर

11

groups() केवल किसी भी स्पष्ट रूप से कब्जा कर लिया समूहों अपने regex (अपने regex में ( दौर कोष्ठक ) से चिह्नित) में, रिटर्न group(0) रिटर्न जबकि संपूर्ण प्रतिलिपि जो आपके रेगेक्स द्वारा मेल खाती है इस पर ध्यान दिए बिना कि आपकी अभिव्यक्ति में कोई कैप्चर समूह है या नहीं।

आपके रेगेक्स में पहला स्पष्ट कैप्चर group(1) इसके बजाय इंगित किया गया है।

पुन अनुवर्ती संपादित करें:

क्यों search मुझे सभी सबस्ट्रिंग नहीं दे सकता?

search() केवल आपके इनपुट स्ट्रिंग में पैटर्न के विरुद्ध पहला मैच लौटाएगा।

+0

मूल पोस्ट संपादित करें। – Alcott

+0

@ एल्कॉट: मैंने एक फॉलो-अप उत्तर जोड़ा। – BoltClock

+0

हेहे। "गोल ब्रैकेट"। –

1

आपके रेगेक्स में कोई मिलान समूह नहीं है, जो माता-पिता द्वारा संकेतित है ((...))।

2

मुझे एक छोटा सा उदाहरण के साथ स्पष्ट करने दें

>>> var2 = "Welcome 44 72" 
>>> match = re.search(r'Welcome (\d+) (\d+)',var2) 
>>> match.groups() 
('44', '72') 
>>> match.groups(0) 
('44', '72') 
>>> match.groups(1) 
('44', '72') 
>>> match.group(0) 
'Welcome 44 72' 
>>> match.group(1) 
'44' 

स्पष्टीकरण: groups() जो सभी मूल्यों जो आपके रेगुलर एक्सप्रेशन के साथ मिलान पैटर्न हैं एक टपल प्रकार है।

groups(0) या groups() या groups(1) .... यह केवल सभी मूल्यों

प्रिंट

समूह() या समूह (0) -> यह मूल्य जो आपके रेगुलर एक्सप्रेशन के साथ पैटर्न का मिलान नहीं हुआ है के साथ पूरी स्ट्रिंग दे देंगे ।

समूह (1) पहला पैटर्न का मिलान नहीं हुआ मूल्य दे देंगे

समूह (2) दूसरा पैटर्न का मिलान नहीं हुआ मूल्य दे देंगे ....

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