2016-04-02 14 views
25

निम्नलिखित उदाहरणों में (regex101.com, पीसीआरई मोड के माध्यम से), मैं यह नहीं समझ सकता कि क्यों + क्वांटिफ़ायर को उप-स्ट्रिंग मिलती है लेकिन * नहीं।* क्यों करता है * मैच करता है?

पहले उदाहरण में, + परिमाणक (1 या अधिक) सभी चार लोअर केस एक पात्रों पाता है (जो मेरी अपेक्षा):

Plus-sign quantifier finds 1 or more as expected

दूसरा उदाहरण में, * परिमाणक (0 या अधिक) किसी भी लोअर केस एक वर्ण नहीं मिल रहा है (जो नहीं है कि मैं क्या उम्मीद):

Asterisk quantifier doesn't find 0 or more

क्या आरईजीईएक्स तर्क बताता है कि "1 या अधिक" (+) सभी चार लोअर-केस वर्णों को क्यों पाता है लेकिन "0 या अधिक" (*) कोई नहीं ढूंढता है?

उत्तर

45

रेगेक्स इंजन बाएं से दाएं स्ट्रिंग में प्रत्येक स्थिति पर पूरे पैटर्न से मिलान करने का प्रयास करेगा। पैटर्न /a*/ स्ट्रिंग की शुरुआत में शून्य a एस से सफलतापूर्वक मेल खाता है। आपके regex101 स्क्रीनशॉट में छोटी बिंदीदार देखभाल यह दर्शाती है - उस स्थिति पर शून्य-चौड़ाई वाला मिलान। यह उस स्थिति में a एस से मेल खाता है, लेकिन कोई भी नहीं है। फिर भी, मैच सफल है।

यदि आप किसी फ़ंक्शन का उपयोग करते हैं जो स्ट्रिंग में सभी रेगेक्स मैचों को लौटाता है, तो यह नए मैचों की तलाश करने के लिए हर बार कम से कम एक अक्षर आगे बढ़ेगा, इसलिए यह aaaa (एक परिणाम के रूप में) से मिल जाएगा इसके लिए अजगर में उदाहरण:

import re 
regex = r"a*" 
input = "AAAAaaaaBBBBbbbb" 
print(re.findall(regex, input)) 

आउटपुट:

['', '', '', '', 'aaaa', '', '', '', '', '', '', '', '', ''] 

, जबकि जब आप /a+/ उपयोग करते हैं, यह उन शून्य चौड़ाई मैचों तो यह इनपुट के माध्यम से कदम जब तक यह पाता है ऐसा नहीं कर सकते, अपनी पहली और केवल aaaa पर मेल खाता है।

+0

यह अजीब है कि यह डिफ़ॉल्ट रूप से लालची नहीं है, या इस सम्मेलन है है? सब्लिमे में यह पूरे aaaa से मेल खाता है जब तक कि आप * * नहीं करते? तो यह इस तरह व्यवहार करता है। –

+12

लालची या नहीं, 'ए *' स्ट्रिंग की शुरुआत में 'ए' की शून्य घटनाओं से मेल खाता है, तो पार्सर आगे क्यों देखेंगे? मुझे नहीं पता कि "सब्लिम" क्या है, लेकिन यह टूटा हुआ लगता है। – ghoti

+0

@ghoti यह एक विंडोज़ टेक्स्ट एडिटर/आईडीई है जैसे नोटपैड ++ (लेकिन यह एनपी ++ की तरह 100% मुफ़्त है) ... लेकिन यह मुझे भी टूटा लगता है: पी। – RastaJedi

7

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

9

अन्य उत्तरों पहले से ही बता रहे हैं कि क्या हो रहा है। लेकिन एक उदाहरण/उदाहरण के लिए, इस आकार के लिए पर कोशिश:

$ echo AAAAaaaabbbb | egrep -o 'a*' && echo "SUCCESS" 

SUCCESS 

ग्रेप के -o विकल्प के प्रभाव आप इनपुट कि regex मिलान किया का ही हिस्सा दिखाने के लिए है। चूंकि जो मिलान हुआ वह "शून्य अक्षर" हुआ, परिणाम खाली है ... लेकिन सफल।

+2

किसी भी कारण से, जब मैंने मिंट लिनक्स 17.3 पर कोशिश की (कॉपी और पेस्ट के माध्यम से), उदाहरण के लिए SUCCESS – RBV

+1

@RBV - दिलचस्प .. और अप्रत्याशित शब्द से ऊपर "aaaa" प्रदर्शित किया गया। मुझे फ्रीबीएसडी या ओएसएक्स में बीएसडी grep (जीएनयू grep संस्करण 2.5.1 के आधार पर) में यह व्यवहार नहीं दिख रहा है, लेकिन मैं उबंटू में जीएनयू grep 2.5.4 के साथ जो कुछ भी देखता हूं उसके समान व्यवहार की पुष्टि कर सकता हूं। मैं विभिन्न जीएनयू greps के बीच इस असंगतता की व्याख्या नहीं कर सकता। यदि आप 'z *' 'के लिए खोज करते हैं, तो आपको सफलता भी दिखाई देगी। – ghoti

+0

"लेकिन मैं इसी तरह के व्यवहार की पुष्टि कर सकता हूं ..." जो मेरे दिमाग में सवाल उठाता है, उदाहरण के लिए कौन सा प्रकार "ट्रस्ट" का अनुमान लगा सकता है या नहीं कर सकता। – RBV

3

शुरुआत में आप मैच देख सकते हैं!

What

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