2012-04-02 21 views
5

Tôi có rất nhiều chuỗi mà tôi muốn kết hợp cho sự giống nhau (mỗi chuỗi trung bình là 30 ký tự). Tôi đã tìm thấy difflib'sSequenceMatcher tuyệt vời cho công việc này vì nó đơn giản và thấy kết quả tốt. Nhưng nếu tôi so sánh hellboyhell-boy như thế nàylàm cho SequenceMatcher của difflib bỏ qua các ký tự "rác"

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

Tôi muốn từ như vậy để cung cấp cho một trận đấu 100 phần trăm tức là ratio of 1.0. Tôi hiểu rằng ký tự rác được chỉ định trong hàm ở trên không được sử dụng để so sánh nhưng tìm các chuỗi kết hợp liền kề dài nhất. Có cách nào tôi có thể thực hiện SequenceMatcher để bỏ qua một số ký tự "rác" cho mục đích so sánh không?

+3

Đó là loại hackish , nhưng bất kỳ lý do gì bạn không thể chỉ xóa các ký tự _junk_ trước khi thực hiện so sánh? Đó là bản chất giống như bỏ qua chúng. –

+0

có thats tốt nhưng tôi muốn tìm ra nếu tôi chỉ có thể làm một số ma thuật 'difflib' và nhận được đi với nó nếu không tôi sẽ phải vượt qua chuỗi thông qua chức năng khác để loại bỏ tất cả các ký tự rác. – lovesh

Trả lời

4

Nếu bạn muốn làm như tôi đã gợi ý trong các ý kiến, (loại bỏ các rác ký tự) phương pháp nhanh nhất là sử dụng str.translate().

ví dụ:

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

Như here, đây là đáng kể (3x) nhanh hơn (và tôi cảm thấy đẹp hơn để đọc) so với một regex.

Lưu ý rằng dưới Python 3.x, hoặc nếu bạn đang sử dụng Unicode theo Python 2.x, điều này sẽ không hoạt động khi thông số delchars không được chấp nhận. Trong trường hợp này, bạn chỉ cần thực hiện ánh xạ tới Không. Ví dụ:

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

Bạn cũng có thể có một chức năng nhỏ để tiết kiệm một số cách gõ nếu bạn có rất nhiều ký tự mà bạn muốn loại bỏ, chỉ làm cho một bộ và đi qua:

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

Nếu bạn đã thực hiện một chức năng để loại bỏ tất cả các nhân vật rác trước khi tay bạn có thể sử dụng lại:

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

cho biểu thức chính quy '-|_|\*' chỉ cần đặt một | giữa tất cả các ký tự rác và nếu nó là một nhân vật lại đặc biệt đặt một \ trước khi nó (như *+)

Các vấn đề liên quan