複数の入力のためにはSequenceMatcherだけではなく、2?
-
23-09-2019 - |
質問
この特定の問題にアプローチする最良の方法について、および任意のライブラリ(のpython好ましいが、必要であれば、私は柔軟にすることができます)。
場合には不思議私は、各ライン上の文字列を含むファイルを持っています。私は最長共通パターンと、各ラインでその場所を見つけるしたいと思います。私は私が上で、ライン1と2、1と3を比較するためにはSequenceMatcherを使用し、その結果を相関させることができることを知っているが、そこに何かがすでにそれをしないという場合はどうなりますか?
理想的には、これらの試合はどこでも、各ライン上に表示されますが、それらは同じで、既存の各行にオフセットし、そこから行くとスタータのために私は罰金することができます。理想的かもしれません、その文字列のテーブルにアクセスするには良いのAPIを持っていますが、私は今のところ何も見つかっていない圧縮ライブラリのようなもの、その適合することを説明ます。
これらのラインと例えば
\x00\x00\x8c\x9e\x28\x28\x62\xf2\x97\x47\x81\x40\x3e\x4b\xa6\x0e\xfe\x8b
\x00\x00\xa8\x23\x2d\x28\x28\x0e\xb3\x47\x81\x40\x3e\x9c\xfa\x0b\x78\xed
\x00\x00\xb5\x30\xed\xe9\xac\x28\x28\x4b\x81\x40\x3e\xe7\xb2\x78\x7d\x3e
私は[5,6] 0-1、および同じ位置とLINE1のすべての行で10-12のマッチ[4,5]がLINE2と一致することを確認したいでしょうLINE3 [7,8]と一致します。
おかげで、
解決
あなたが望むすべてが各行に同じオフセットである共通部分文字列を見つけることであるならば、あなたが必要なのはこのようなものです。
matches = []
zipped_strings = zip(s1,s2,s3)
startpos = -1
for i in len(zipped_strings):
c1,c2,c3 = zipped_strings[i]
# if you're not inside a match,
# look for matching characters and save the match start position
if startpos==-1 and c1==c2==c3:
startpos = i
# if you are inside a match,
# look for non-matching characters, save the match to matches, reset startpos
elif startpos>-1 and not c1==c2==c3:
matches.append((startpos,i,s1[startpos:i]))
# matches will contain (startpos,endpos,matchstring) tuples
startpos = -1
# if you're still inside a match when you run out of string, save that match too!
if startpos>-1:
endpos = len(zipped_strings)
matches.append((startpos,endpos,s1[startpos:endpos]))
最長共通パターンを見つけるには、は場所に関係なく、SequenceMatcherオブジェクトは最高のアイデアのような音を行いますが、その代わりにはstring3にstring2の、その後がstring1に文字列1を比較し、結果をマージしようとしているの、単なる文字列1と文字列2のすべての共通部分文字列を取得します( )get_matching_blocksで、その後、すべての3つの文字列の間の一致を得るためにはstring3にそのそれぞれの結果を比較します。
他のヒント
あなたの問題のパフォーマンスですか?
あなたの入力はどのくらいいるのですか?
2と一致するように、最小の文字列の長さですか?
あなたの例は、あなたが期待する結果は、あなたが提供されるサンプル文字列が一致しないと、私は考えて修正されていないことです。注意