2012-01-25 15 views
10

स्कूल के लिए मुझे एक पायथन आरई स्क्रिप्ट लिखनी है जो आईपी पते निकालती है। मैं जिस नियमित अभिव्यक्ति का उपयोग कर रहा हूं वह re.search() के साथ काम करता है लेकिन re.findall() के साथ नहीं।पायथन नियमित अभिव्यक्तियां - re.search() बनाम re.findall()

exp = "(\d{1,3}\.){3}\d{1,3}" 
ip = "blah blah 192.168.0.185 blah blah" 
match = re.search(exp, ip) 
print match.group() 

कि के लिए मैच हमेशा 192.168.0.185 है, लेकिन इसके अलग है जब मैं re.findall()

exp = "(\d{1,3}\.){3}\d{1,3}" 
ip = "blah blah 192.168.0.185 blah blah" 
matches = re.findall(exp, ip) 
print matches[0] 

0. 

मैं सोच रहा हूँ करना क्यों re.findall() पैदावार 0. जब re.search(), 192.168.0.185 पैदावार के बाद से मैं मैं दोनों कार्यों के लिए एक ही अभिव्यक्ति का उपयोग कर रहा हूँ।

और इसे बनाने के लिए मैं क्या कर सकता हूं re.findall() वास्तव में अभिव्यक्ति का सही ढंग से पालन करेगा? या क्या मैं किसी तरह की गलती कर रहा हूं?

उत्तर

12

findall मैचों की एक सूची देता है, और प्रलेखन से:

एक या अधिक समूहों पैटर्न में मौजूद हैं, समूहों की एक सूची प्रदान; यदि पैटर्न में एक से अधिक समूह हैं तो यह tuples की एक सूची होगी।

तो, अपने पिछले अभिव्यक्ति एक समूह से मेल खाने वाला स्ट्रिंग जहां आखिरी मैच 0.

था आपकी समस्या को ठीक करने के लिए उपयोग में 3 बार किया था: exp = "(?:\d{1,3}\.){3}\d{1,3}"; गैर-समूह संस्करण का उपयोग करके, कोई लौटा समूह नहीं है, इसलिए दोनों मामलों में मैच वापस कर दिया गया है।

+0

यह अच्छी तरह से काम करता है, धन्यवाद। – user1168906

3

आप केवल उस रेगेक्स में 0 को कैप्चर कर रहे हैं, क्योंकि यह पकड़ा गया आखिरी वाला होगा।

बदलें पूरे आईपी कब्जा करने के लिए अभिव्यक्ति, और बार-बार भाग एक गैर पर कब्जा समूह होने के लिए:

In [2]: ip = "blah blah 192.168.0.185 blah blah" 

In [3]: exp = "((?:\d{1,3}\.){3}\d{1,3})" 

In [4]: m = re.findall(exp, ip) 

In [5]: m 
Out[5]: ['192.168.0.185'] 

In [6]: 

और अगर यह regex की व्याख्या करने में मदद करता है:

In [6]: re.compile(exp, re.DEBUG) 
subpattern 1 
    max_repeat 3 3 
    subpattern None 
     max_repeat 1 3 
     in 
      category category_digit 
     literal 46 
    max_repeat 1 3 
    in 
     category category_digit 

इससे पता चलता है subpatterns। Subpattern 1 है जो findall द्वारा कब्जा कर लिया जाता है।

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