python-difflib.SequenceMatcher无法与三个字节进行比较

时间:2014-01-04 11:49:33

标签: python

我想比较两个字符串之间的全角形式,但是使用有问题的difflib.SequenceMatcher。 我的代码是

aa = "abcdfgr"

bb = "abcdefgh"

s = difflib.SequenceMatcher(None,aa,bb)

e=round(s.ratio(),4)*100

print e

for tag, i1, i2, j1, j2 in s.get_opcodes():

print tag,i1,i2,j1,j2

print aa[i1:i2]

print bb[j1:j2]

但它打印出来像这样

88.89

equal 0 14 0 14

abcdïᄑ

abcdïᄑ

insert 14 14 14 17



ナïᄑ

equal 14 20 17 23

ニgïᄑ

ニgïᄑ

replace 20 21 23 24

メ

ネ

我认为difflib.SequenceMatcher可以逐个比较一个字节,反正可以让difflib.SequenceMatcher一次比较三个字节?或者无论如何都可以顺利进行比较,但仍然可以使用ratio()get_opcodes()函数。谢谢!

1 个答案:

答案 0 :(得分:0)

SequenceMatcher可以比较可清洗对象的序列。它们不一定是字符串。因此,可以比较3元组的序列,其中3元组是3字节的元组。

您可以使用grouper recipe

将字符串中的字节分组为3个组
In [23]: aa = "abcdfgr"

In [24]: zip(*[iter(aa)]*3)
Out[24]: 
[('\xef', '\xbd', '\x81'),
 ('\xef', '\xbd', '\x82'),
 ('\xef', '\xbd', '\x83'),
 ('\xef', '\xbd', '\x84'),
 ('\xef', '\xbd', '\x86'),
 ('\xef', '\xbd', '\x87'),
 ('\xef', '\xbd', '\x92')]

请注意,在我的计算机上,straa被解释为以UTF-8编码。根据您的编码,您的结果可能会有所不同。

如果要处理长度不是3的倍数的字符串,请使用itertools.izip_longest而不是zipzip省略余数。


import difflib
aa = "abcdfgr"
bb = "abcdefgh"

print(repr(aa))
print(repr(bb))

aaa = zip(*[iter(aa)]*3)
bbb = zip(*[iter(bb)]*3)
print(len(aa), len(bb))
s = difflib.SequenceMatcher(None, aaa, bbb)

e=round(s.ratio(),4)*100

print e

for tag, i1, i2, j1, j2 in s.get_opcodes():    
    print tag,i1,i2,j1,j2    
    print aaa[i1:i2]    
    print bbb[j1:j2]