想知道解决这个特殊问题的最佳方法,如果有任何库(Python最好,但如果需要的话我可以灵活处理)。
我有一个文件,每行有一个字符串我想找出最长的共同模式和他们在每一行的位置我知道我可以使用SequenceMatcher比较第1行和第2行、第1行和第3行,等等,然后将结果关联起来,但是如果有什么已经做到了呢?
理想情况下,这些匹配将出现在每一行的任何地方,但对于初学者来说,我可以很好地用它们在每一行中的相同偏移量,并从那里开始。类似于一个压缩库,它有一个很好的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
我想看到0-1和10-12在同一位置的所有行中匹配,第1行[4,5]匹配第2行[5,6]匹配第3行[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听起来确实是最好的主意,但是与其比较string1和string2,然后比较string1和string3并尝试合并结果,不如只获取string1和string2的所有公共子字符串(使用get-u-matching-u块)然后将每个结果与string3进行比较,以获得所有三个字符串之间的匹配。
关于python - 用于多个输入的SequenceMatcher,而不仅仅是两个?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2562893/