6

類似性のために一致させたい文字列がたくさんあります(各文字列は平均30文字です)。difflib's SequenceMatcherシンプルで結果が良かったので、このタスクには最適でした。しかし、私がこれを比較hellboyしてhell-boy好きなら

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

私はそのような言葉が100パーセント一致することを望みますratio of 1.0。上記の関数で指定されたジャンク文字は比較には使用されませんが、最も長い連続した一致するサブシーケンスを見つけるために使用されることを理解しています。比較のためにいくつかの「ジャンク」文字を無視する方法はありSequenceMatcherますか?

4

2 に答える 2

4

コメントで提案したように(ジャンク文字を削除して)実行したい場合は、を使用するのが最も速い方法ですstr.translate()

例えば:

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

ここに示されているように、これは正規表現よりも大幅に(3倍)高速です(そして読みやすくなっています)。

Python 3.xでは、またはPython 2.xでUnicodeを使用している場合は、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.
于 2012-04-03T10:16:09.587 に答える
1

事前にすべてのジャンク文字を削除する関数を作成する場合は、re:を使用できます。

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

正規表現の場合'-|_|\*'は、|を入力するだけです。すべてのジャンク文字の間で、その特別な再文字がその\前に置かれている場合(およびのよう*+

于 2012-04-03T00:39:12.073 に答える