0

私が必要なのは:

text_file_1.txt:
apple
orange
ice
icecream

text_file_2.txt:
apple
pear
ice

「set」を使用すると、出力は次のようになります。

apple
ice

(「re.matchと同等」)

しかし、私は取得したい:

apple
ice
icecream

(「re.searchに相当」)

これを行う方法はありますか?ファイルは大きいので、それを繰り返して正規表現を使用することはできません。

4

2 に答える 2

2

あなたはdifflibをチェックアウトしたいかもしれません

于 2011-07-07T15:48:21.670 に答える
1

ファイルから、一方が他方の部分文字列である単語(同一のものを含む)を抽出することだけが必要な場合は、次のことができます。

fone = set(['apple', 'orange', 'ice', 'icecream'])
ftwo = set(['apple' ,'pear' ,'ice'])
# transforming to sets saves to check twice for the same combination

result = []
for wone in fone:
    for wtwo in ftwo:
        if wone.find(wtwo) != -1 or wtwo.find(wone) != -1:
            result.append(wone)
            result.append(wtwo)
for w in set(result):
    print w

または、文字列が文字の順序でどのように類似しているかに基づいて類似性が必要な場合は、ポールが回答で提案したように、difflib が提供するクラスの 1 つを使用できます。

import difflib as dl

fone = set(['apple', 'orange', 'ice', 'icecream'])
ftwo = set(['apple' ,'pear' ,'ice'])

result = []
for wone in fone:
    for wtwo in ftwo:
        s = dl.SequenceMatcher(None, wone, wtwo)
        if s.ratio() > 0.6:  #0.6 is the conventional threshold to define "close matches"
            result.append(wone)
            result.append(wtwo)
for w in set(result):
    print w

私は 2 つのサンプルのいずれも時間を測定しませんでしたが、2 番目のサンプルは、オブジェクトをインスタンス化する必要があるため、実行速度がはるかに遅くなると思います...

于 2011-07-07T15:56:21.873 に答える