मौजूदा समाधान के गैर-अतिव्यापी घटनाओं पर findall
आधारित की संख्या लौट गैर-अतिव्यापी मैचों के लिए ठीक हैं (और शायद मैचों की भारी संख्या के अलावा कोई संदेह नहीं है इष्टतम), हालांकि sum(1 for m in re.finditer(thepattern, thestring))
जैसे विकल्प (सूची की भौतिकता को हमेशा से बचाने के लिए जब आप जिनकी परवाह है, वे भी गिनती हैं) भी काफी संभव हैं। कुछ हद तक विशेष स्वभाव का subn
का उपयोग कर किया जाएगा और जिसके परिणामस्वरूप स्ट्रिंग अनदेखी ...:
def countnonoverlappingrematches(pattern, thestring):
return re.subn(pattern, '', thestring)[1]
बाद इस विचार का केवल वास्तविक लाभ अगर आप केवल (मान) की गणना करने के लिए 100 मैचों अप करने के लिए परवाह आएगा; फिर, re.subn(pattern, '', thestring, 100)[1]
व्यावहारिक हो सकता है (100 लौट रहा है चाहे 100 मैचों, या 1000, या यहां तक कि बड़ी संख्याएं हों)।
गिनती मैचों की ओवरलैपिंग आपको अधिक कोड लिखने की आवश्यकता है, क्योंकि प्रश्न में अंतर्निहित कार्य सभी गैर-ओवरलैपिंग मैचों पर केंद्रित हैं। परिभाषा की एक समस्या भी है, उदाहरण के साथ, पैटर्न 'a+'
और स्ट्रिंग 'aa'
होने के साथ, क्या आप इसे केवल एक मैच, या तीन (पहले a
, दूसरा, दोनों), या ... के रूप में मानेंगे?
उदाहरण है कि आप संभवतः को लेकर टकराव पैदा करना चाहते हैं स्ट्रिंग में अलग धब्बे (जो तब पिछले पैराग्राफ में उदाहरण के लिए दो मैचों देना होगा) पर शुरू मैचों के लिए मान लिया जाये:
def countoverlappingdistinct(pattern, thestring):
total = 0
start = 0
there = re.compile(pattern)
while True:
mo = there.search(thestring, start)
if mo is None: return total
total += 1
start = 1 + mo.start()
नोट आप करते हैं कि इस मामले में पैटर्न को आरई ऑब्जेक्ट में संकलित करना होगा: फ़ंक्शन re.search
तर्क (खोज के लिए प्रारंभ करने की स्थिति) को विधिsearch
करता है, इसलिए आपको स्ट्रिंग को स्लाइसिंग करना होगा - अगली खोज होने की तुलना में निश्चित रूप से अधिक प्रयास अगले संभावित विशिष्ट प्रारंभ बिंदु पर टार्ट, जो मैं इस समारोह में कर रहा हूं।
क्या आपको ओवरलैपिंग मैचों की गणना करने की आवश्यकता है? क्या एक दोस्त के दोस्त "दोस्त के दोस्त" दोस्त में एक या दो बार "दोस्त का मित्र" है? –
मुझे ओवरलैपिंग की आवश्यकता है। – Dan
आपको ओवरलैपिंग की आवश्यकता है? इसलिए, यदि मिलान पैटर्न "aa" है और स्रोत स्ट्रिंग "aaaa" सही उत्तर 3 है? – steveha