我想比较两个字符串之间的全角形式,但是使用有问题的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()
函数。谢谢!
答案 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')]
请注意,在我的计算机上,str
,aa
被解释为以UTF-8编码。根据您的编码,您的结果可能会有所不同。
如果要处理长度不是3的倍数的字符串,请使用itertools.izip_longest
而不是zip
。zip
省略余数。
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]