2012-04-02 2 views
5

У меня есть много строк, которые я хочу сопоставить для сходства (каждая строка составляет в среднем 30 символов). Я нашел difflib'sSequenceMatcher отлично подходит для этой задачи, поскольку это было просто и нашло результаты хорошо. Но если я сравнить hellboy и hell-boy как этотСоздание последовательности символов difflib SequenceMatcher игнорировать символы «нежелательной»

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

Я хочу, чтобы такие слова, чтобы дать матч на 100 процентов ratio of 1.0 то есть. Я понимаю, что символ нежелательной почты, указанный в приведенной выше функции, не используется для сравнения, а находит самую длинную непрерывную подпоследовательность. Есть ли способ, которым я могу сделать SequenceMatcher, чтобы игнорировать некоторые «нежелательные» символы для целей сравнения?

+3

Это своего родом хак , но по какой-либо причине вы не могли просто удалить символы _junk_ перед выполнением сравнения? По сути, это то же самое, что игнорировать их. –

+0

да, это хорошо, но я хотел выяснить, могу ли я просто сделать некоторую магию «difflib» и уйти с ней, иначе мне пришлось бы передать строку через другую функцию, чтобы сначала удалить все ненужные символы. – lovesh

ответ

4

Если вы хотите сделать, как я предложил в комментариях, (удаление ненужных символов) самый быстрый метод использовать str.translate().

например:

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

Как показано here, это значительно (3x) быстрее (и я чувствую себя лучше читать), чем регулярное выражение.

Обратите внимание, что под Python 3.x, или если вы используете Unicode под Python 2.x, это не будет работать, поскольку параметр delchars не принимается. В этом случае вам просто нужно сделать сопоставление None. Например:

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) 

для регулярного выражения '-|_|\*' просто положить | между всеми персонажами бросовых и если его специальный повторно характер положить \ перед ним (как * и +)

 Смежные вопросы

  • Нет связанных вопросов^_^