2008-10-08 9 views
304

Python re module में search() और match() फ़ंक्शंस के बीच क्या अंतर है?re.search और re.match के बीच क्या अंतर है?

मैंने documentation (current documentation) पढ़ा है, लेकिन मुझे कभी याद नहीं आया। मैं इसे देखना और इसे फिर से सीखना जारी रखता हूं। मैं उम्मीद कर रहा हूं कि कोई इसका उदाहरण उदाहरणों के साथ स्पष्ट रूप से उत्तर देगा ताकि (शायद) यह मेरे सिर में टिकेगा। या कम से कम मेरे पास मेरे प्रश्न के साथ लौटने के लिए एक बेहतर जगह होगी और इसे फिर से सीखने में कम समय लगेगा।

उत्तर

313

re.match स्ट्रिंग की शुरुआत में एंकर किया गया है। इसमें न्यूलाइन के साथ कुछ लेना देना नहीं है, इसलिए यह पैटर्न में ^ का उपयोग करने जैसा नहीं है।

re.match documentation के रूप में कहते हैं:

तो स्ट्रिंग की शुरुआत में शून्य या अधिक वर्ण रेगुलर एक्सप्रेशन पैटर्न से मेल खाते हैं, एक इसी MatchObject उदाहरण लौट आते हैं। वापसी None यदि स्ट्रिंग पैटर्न से मेल नहीं खाता है; ध्यान दें कि यह शून्य-लंबाई मिलान से अलग है।

नोट: यदि आप स्ट्रिंग में कहीं भी एक मैच का पता लगाने, बजाय search() उपयोग करना चाहते हैं।

re.search खोजें the documentation says के रूप में पूरी स्ट्रिंग,:

स्ट्रिंग के माध्यम से स्कैन एक स्थान जहां नियमित अभिव्यक्ति पैटर्न एक मैच का उत्पादन के लिए देख रहा है, और एक MatchObject उदाहरण इसी लौट आते हैं। None पर लौटें यदि स्ट्रिंग में कोई स्थिति पैटर्न से मेल नहीं खाती है; ध्यान दें कि यह शून्य-लंबाई मिलान स्ट्रिंग में किसी बिंदु पर शून्य-लंबाई मिलान खोजने से अलग है।

तो यदि आपको स्ट्रिंग की शुरुआत में मिलान करने की आवश्यकता है, या पूरे स्ट्रिंग का उपयोग match से मिलान करने की आवश्यकता है। यह तेज़ है। अन्यथा search का उपयोग करें।

अजगर नियमित भाव के आधार पर दो अलग-अलग आदिम आपरेशन प्रदान करता है::

प्रलेखन एक specific section for match vs. search कि भी बहु तार को शामिल किया गया है केवल शुरुआत स्ट्रिंग के में एक मैच के लिए match चेक, जबकि search स्ट्रिंग में कहीं भी स्ट्रिंग में यह जांच करता है (यह पर्ल डिफ़ॉल्ट रूप से करता है)।

ध्यान दें कि match यहाँ तक कि जब एक नियमित अभिव्यक्ति का उपयोग कर '^' के साथ शुरुआत search से अलग हो सकता: केवल स्ट्रिंग के शुरू में '^' मिलान या MULTILINE मोड में भी तुरंत एक नई पंक्ति के बाद। "match" आपरेशन सफल होता है केवल तभी पैटर्न मोड की परवाह किए बिना तार का शुरू में मिलान नहीं होता या कि क्या एक न्यू लाइन इससे पहले आने की परवाह किए बिना वैकल्पिक pos तर्क द्वारा दिए गए शुरू करने की स्थिति में।

अब, पर्याप्त बात है।

# example code: 
string_with_newlines = """something 
someotherthing""" 

import re 

print re.match('some', string_with_newlines) # matches 
print re.match('someother', 
       string_with_newlines) # won't match 
print re.match('^someother', string_with_newlines, 
       re.MULTILINE) # also won't match 
print re.search('someother', 
       string_with_newlines) # finds something 
print re.search('^someother', string_with_newlines, 
       re.MULTILINE) # also finds something 

m = re.compile('thing$', re.MULTILINE) 

print m.match(string_with_newlines) # no match 
print m.match(string_with_newlines, pos=4) # matches 
print m.search(string_with_newlines, 
       re.MULTILINE) # also matches 
+0

न्यूलाइन युक्त तारों के बारे में क्या? –

+0

स्ट्रिंग्स के साथ भी न्यूलाइन, मिलान() स्ट्रिंग के BEGINNING पर मेल खाता है। – nosklo

+0

यही वह जवाब है जिसके लिए मैं उम्मीद कर रहा था! (विशेष रूप से अब आपने एक उदाहरण प्रदान किया है।) –

12

re.match स्ट्रिंग की शुरुआत में एक पैटर्न मिलान करने के लिए प्रयास करता है: समय कुछ उदाहरण कोड को देखने के लिए। re.search पैटर्न स्ट्रिंग के मिलान से मिलान करने का प्रयास करता है जब तक कि यह कोई मिलान न हो जाए।

46

re.searchखोज पैटर्न स्ट्रिंग भर के लिए तों, जबकि re.match करता पैटर्न की खोज नहीं; यदि ऐसा नहीं होता है, तो इसकी स्ट्रिंग की शुरुआत में मिलान से कोई अन्य विकल्प नहीं है।

+3

शुरुआत में क्यों मेल खाता है, लेकिन स्ट्रिंग के अंत तक नहीं (फ़िटन 3.4 में 'पूर्णकालिक')? –

53

search ⇒ स्ट्रिंग में कहीं भी कुछ ढूंढें और एक मैच ऑब्जेक्ट लौटाएं।

matchस्ट्रिंग के से शुरू करें और एक मैच ऑब्जेक्ट लौटाएं।

17

आप re.match की कार्यप्रणाली को समझने के लिए और re.search

a = "123abc" 
t = re.match("[a-z]+",a) 
t = re.search("[a-z]+",a) 

re.match कोई भी वापस आ जाएगी करने के लिए नीचे दिए गए उदाहरण उल्लेख कर सकते हैं, लेकिन re.search वापस आ जाएगी एबीसी।

+1

बस यह खोज जोड़ना चाहेंगे कि वह खोज _sre.SRE_Match ऑब्जेक्ट लौटाएगी (या कोई नहीं मिला तो नहीं)। 'एबीसी' प्राप्त करने के लिए, आपको t.group() – SanD

18

अंतर है, re.match() misleads किसी के आदी पर्ल, ग्रेप, या नियमित अभिव्यक्ति मिलान sed, और re.search() नहीं करता है। :-)

अधिक सौम्य, As John D. Cook remarks, re.match() "व्यवहार करता है जैसे हर पैटर्न में^प्रीपेन्ड किया गया है।" दूसरे शब्दों में, re.match('pattern')re.search('^pattern') के बराबर है। तो यह एक पैटर्न के बाईं तरफ एंकर करता है। लेकिन यह भी पैटर्न की दाईं ओर एंकर नहीं करता है: कि अभी भी $ को समाप्त करने की आवश्यकता है।

स्पष्ट रूप से ऊपर दिया गया, मुझे लगता है कि re.match() को बहिष्कृत किया जाना चाहिए। मुझे उन कारणों को जानने में दिलचस्पी होगी जिन्हें इसे बनाए रखा जाना चाहिए।

+1

पर कॉल करने की आवश्यकता है "व्यवहार करता है जैसे हर पैटर्न में^प्रीपेड किया गया है।" केवल तभी सच है यदि आप मल्टीलाइन विकल्प का उपयोग नहीं करते हैं। सही कथन है "... \ pre prepended है" – JoelFan

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