2012-04-02 12 views
5

Benzerlik için eşleştirmek istediğim çok sayıda dizim var (her bir dize ortalama 30 karakterdir). Bu işlem için difflib'sSequenceMatcher numaralı telefonu buldum ve bu işlemin sonuçları gayet iyi. ben budifflib'in sırasını yapma SequenceMatcher "önemsiz" karakterleri yok sayılır

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

gibi hellboy ve hell-boy karşılaştırırsanız Ama bu tür kelimeler ratio of 1.0 yani yüzde 100 maç vermek istiyorum. Yukarıdaki işlevde belirtilen önemsiz karakterin karşılaştırma için kullanılmadığını, ancak en uzun bitişik eşleşen alt dizeyi bulmadığını anlıyorum. Karşılaştırma amacıyla bazı "önemsiz" karakterleri yok saymak için SequenceMatcher yapabilirim bir yolu var mı?

+3

Biraz hackish var , ancak karşılaştırma yapmadan önce _junk_ karakterlerini kaldıramayacağınız herhangi bir sebep var mı? Aslında onları görmezden gelmekle aynı şeydir. –

+0

evet bu iyi ama ben sadece bir 'difflib' sihrini yapıp onunla uzaklaşıp kapatamayacağımı anlamaya çalıştım, aksi takdirde ilk önce tüm önemsiz karakterleri kaldırmak için dizgiyi başka bir işlevden geçirmeliyim. – lovesh

cevap

4

tüm önemsiz karakterler arasında ve eğer onun özel re karakteri ondan önce bir \ koymak (gibi * ve +) str.translate() kullanmak için.

Örn: here görüldüğü gibi, bu anlamlı olduğunu

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

(3x) daha hızlı (ve Okumayı güzel hissetmek) bir regex daha.

Python 3.x altında ya da Python 2.x altında Unicode kullanıyorsanız, bu delchars parametresi olarak kabul edilmeyecektir. Bu durumda, hiçbiri için bir eşleme yapmalısınız. Ör:

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

Ayrıca size, kaldırmak sadece bir dizi yapmak ve içinden geçmek isteyen karakter bir sürü varsa bazı yazmaktan kurtarır için küçük bir işlev olabilir:

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

Eğer eli yeniden kullanmak edemeden tüm önemsiz karakterini kaldırmak için bir işlev yapmak olsaydı: Sadece bir koyun düzenli ifade '-|_|\*' için

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

| Ben en hızlı yöntemdir (önemsiz karakterleri kaldırma), Yorum önerilen olarak yapmanız isterseniz

İlgili konular