2012-08-12 14 views
6

मान लें कि मेरे प्रोग्राम में ऐसे इनपुट प्राप्त होते हैं जैसे वर्णों की एक स्ट्रिंग जिसमें किसी प्रकार का चरित्र होता है। उदाहरण के लिए, 'बॉब बैगल शॉप'। फिर यह एक और स्ट्रिंग हो जाता है जो 'फ्रेड बैगल स्टोर' कहता है। इन तुलना करने के लिए मैं नियमित अभिव्यक्तियों या पाइथन में कुछ अन्य मॉड्यूल का उपयोग कैसे कर सकता हूं और मेरा प्रोग्राम मुझे बता सकता है कि वर्णों की कम से कम 5 (या कोई भी संख्या जो मैं चाहता हूं) स्ट्रिंग स्ट्रिंग में कहीं भी हैं, लेकिन सभी एक ही आदेश, जैसे 'Bagel' शब्द?पाठ/वर्णों की तुलना करने के लिए नियमित अभिव्यक्तियों (या एक अन्य पायथन मॉड्यूल) का उपयोग करें?

धन्यवाद।

+0

क्या यह तुलना करना उपयोगी होगा कि कितने शब्द समान हैं? यह किसी भी पांच पात्रों के परीक्षण से कहीं अधिक कुशल होगा! –

+0

@ बिलीमून समस्या यह है ... ये आमतौर पर व्यावसायिक नाम होते हैं (जैसे मैकडॉनल्ड्स या कुछ हाहा) ... इसलिए इसमें पात्र हो सकते हैं .. लेकिन हां, यह शायद आसान होगा। –

+1

आप यह निर्धारित करने के लिए रेगेक्स का उपयोग कर सकते हैं कि आप एक शब्द (विशेष वर्ण आदि सहित) पर विचार करते हैं, और उसके बाद प्रत्येक शब्द के विरुद्ध प्रत्येक शब्द के विरुद्ध पहली स्ट्रिंग में प्रत्येक शब्द को चेक करें। इस उदाहरण के लिए –

उत्तर

13

एक अजगर मानक पुस्तकालय वर्ग difflib.SequenceMatcher अपनी समस्या को हल करने में मदद मिलेगी कि नहीं है। यहाँ एक कोड नमूना है:

from difflib import SequenceMatcher 

s1 = "Bob's Bagel Shop" 
s2 = "Bill's Bagel Shop" 

matcher = SequenceMatcher(a=s1, b=s2) 
match = matcher.find_longest_match(0, len(s1), 0, len(s2)) 

परिणाम:

Match(a=3, b=4, size=13) # value that 'match' variable holds 

परिणाम से पता चलता दोनों स्ट्रिंग 13 वर्ण लंबाई (पहली स्ट्रिंग और 4-वें चार में 3-वां चार से शुरू के साथ बराबर-स्ट्रिंग है दूसरी स्ट्रिंग)।

आप मूल्यों के रूप में अपनी क्षेत्रों पाने के लिए इस मैच परिणाम वस्तु का उपयोग कर सकते हैं:

match.size # 13 
match.a  # 3 
match.b  # 4 
+0

+1 एक बहुत अच्छी तरह से समझाया उत्तर। अच्छी नौकरी। – fdomig

+0

यह सही है! धन्यवाद! –

+0

मैं आउटपुट से 'आकार' कैसे प्राप्त कर सकता हूं? मुझे उस नंबर की ज़रूरत है। –

1

आप itetools.combinations उपयोग करना और फिर सेट की intersection उपयोग कर सकते हैं दोनों तार से मिलान करने वाले वर्णों पता लगाने के लिए:

from itertools import combinations 
str1="Bob's Bagel Shop" 
str2="Fred's Bagel Store" 

def combi(strs): 
    chars=''.join(strs.split()) 
    lis=[] 
    for x in range(1,len(chars)): 
     for y in combinations(chars,x): 
      if ''.join(y) in chars: 
       lis.append(''.join(y)) 
    return lis   


lis1=combi(str1) 
lis2=combi(str2) 
print max(set(lis1).intersection(set(lis2)),key=len) 

आउटपुट:

'sBagelS