2012-04-02 9 views
5

मेरे पास बहुत सारे स्ट्रिंग हैं जिन्हें मैं समानता के लिए मिलान करना चाहता हूं (प्रत्येक स्ट्रिंग औसत पर 30 वर्ण है)। मुझे difflib'sSequenceMatcher इस कार्य के लिए बहुत अच्छा लगता है क्योंकि यह आसान था और परिणाम अच्छे पाए गए। लेकिन अगर मैं hellboy और hell-boy तुलना इसdifflib के अनुक्रम MATcher को "जंक" वर्णों को अनदेखा करें

>>> sm=SequenceMatcher(lambda x:x=='-','hellboy','hell-boy') 
>>> sm.ratio() 
0: 0.93333333333333335 

जैसे मैं ऐसे शब्दों ratio of 1.0 यानी 100 प्रतिशत मैच देना चाहते हैं। मैं समझता हूं कि ऊपर दिए गए फ़ंक्शन में निर्दिष्ट जंक कैरेक्टर का उपयोग तुलना के लिए नहीं किया जाता है, लेकिन बाद में सबसे व्यस्त मिलान मिलान मिलता है। क्या कोई तरीका है कि मैं तुलनात्मक उद्देश्य के लिए कुछ "जंक" वर्णों को अनदेखा करने के लिए SequenceMatcher बना सकता हूं?

+3

यह एक तरह से hackish है , लेकिन किसी भी कारण से आप तुलना करने से पहले _junk_ अक्षर को हटा नहीं सकते? यह अनिवार्य रूप से वही बात है जो उन्हें अनदेखा कर रहा है। –

+0

हाँ यह अच्छा है लेकिन मैं यह जानना चाहता था कि क्या मैं कुछ 'difflib' जादू कर सकता हूं और इससे दूर हो सकता हूं अन्यथा मुझे सभी जंक वर्णों को हटाने के लिए स्ट्रिंग को किसी अन्य फ़ंक्शन के माध्यम से पास करना होगा। – lovesh

उत्तर

4

आप के रूप में मैं टिप्पणी में सुझाव दिया, (कबाड़ वर्ण हटाने का) सबसे तेजी से विधि है कार्य करना चाहते हैं str.translate() का उपयोग करने के लिए।

उदा:

to_compare = to_compare.translate(None, {"-"}) 

दिखाया गया है here, यह काफी है (3x) तेजी से (और मैं पढ़ने के लिए अच्छे लग रहा है) एक regex से।

ध्यान दें कि पायथन 3.x के तहत, या यदि आप पाइथन 2.x के तहत यूनिकोड का उपयोग कर रहे हैं, तो यह काम नहीं करेगा क्योंकि delchars पैरामीटर स्वीकार नहीं किया गया है। इस मामले में, आपको बस किसी को मैपिंग करने की आवश्यकता नहीं है। उदाहरण के लिए:

translation_map = str.maketrans({"-": None}) 
to_compare = to_compare.translate(translation_map) 

तुम भी कुछ लेखन बच यदि आप आपके निकालें सिर्फ एक सेट बनाने के लिए और के माध्यम से पारित करने के लिए चाहते वर्णों की एक बहुत कुछ है एक छोटा सा समारोह हो सकता है:

def to_translation_map(iterable): 
    return {key: None for key in iterable} 
    #return dict((key, None) for key in iterable) #For old versions of Python without dict comps. 
1

इससे पहले कि आप हाथ आप फिर से इस्तेमाल कर सकते हैं सभी जंक चरित्र को दूर करने के लिए एक समारोह बनाने के लिए थे, तो: नियमित अभिव्यक्ति '-|_|\*' के लिए

string=re.sub('-|_|\*','',string) 

सिर्फ एक डाल | (+ तरह * और) सब कबाड़ वर्णों के बीच और अगर इसकी एक विशेष फिर से चरित्र यह पहले एक \ डाल

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