字符串序列比较

2021-11-08 作者: admin 浏览: 243 次

摘要: 字符串序列比较¶difflib模块提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面,如果需要比较目录的不同,可以使用filecmp模块。 Python 中的 difflib 类¶dif...

字符串序列比较

difflib模块提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面,如果需要比较目录的不同,可以使用filecmp模块。

Python 中的 difflib 类

difflib.SequenceMatcher

此类提供了比较任意可哈希类型序列对方法。此方法将寻找没有包含‘垃圾’元素的最大连续匹配序列。

通过对算法的复杂度比较,它由于原始的完形匹配算法,在最坏情况下有n的平方次运算,在最好情况下,具有线性的效率。

它具有自动垃圾启发式,可以将重复超过片段1%或者重复200次的字符作为垃圾来处理。可以通过将autojunk设置为false关闭该功能。

difflib.Differ

此类比较的是文本行的差异并且产生适合人类阅读的差异结果或者增量结果,结果中各部分的表示如下:

  • 带有减号-前缀的文本行存在于第一个序列,而不存在于第二个序列;
  • 带有加号+前缀的文本行存在于第二个序列,而不存在于第一个序列;
  • 如果一行文本存在不同之处,那么会用一行额外的、以问号?打头的文本来标识出不同之处。
  • 如果文本没有变化,那该行文本会以空格作为前缀,这样就可以与那些有变化的文本行对齐。

difflib.HtmlDiff

此类可以被用来创建HTML表格 (或者说包含表格的html文件) ,两边对应展示或者行对行的展示比对差异结果。

make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])

make_table(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])

以上两个方法都可以用来生成包含一个内容为比对结果的表格的html文件,并且部分内容会高亮显示。

difflib.context_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])

使用 Differ() 函数进行比较

比较a与b(字符串列表),并且返回一个差异文本行的生成器

In [2]:
import difflib

s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
for line in difflib.context_diff(s1, s2, fromfile='before.py', tofile='after.py'):
    print(line.strip())  
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
guido
--- 1,4 ----
! python
! eggy
! hamster
guido

difflib.get_close_matches(word, possibilities[, n][, cutoff])

返回最大匹配结果的列表,返回列表中所有与‘apple’最大的匹配结果

In [3]:
difflib.get_close_matches('appel', 
                          ['ape', 'apple', 'peach', 'puppy'])
Out[3]:
['apple', 'ape']

返回 wheel 与Python中所有的关键字(keyword.kwlist)最大的匹配结果,如果没有匹配结果返回False

In [4]:
import keyword
difflib.get_close_matches('wheel', keyword.kwlist)
Out[4]:
['while']
In [5]:
difflib.get_close_matches('apple', keyword.kwlist)
Out[5]:
['False']

difflib.ndiff(a, b[, linejunk][, charjunk])

比较a与b(字符串列表),返回一个Differ-style 的差异结果

In [6]:
diff = difflib.ndiff('one\ntwo\nthree\n'.splitlines(1),
                     'ore\ntree\nemu\n'.splitlines(1))
print (''.join(diff))
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu

difflib.restore(sequence, which)

返回一个由两个比对序列产生的结果,并将生成的delta具体化为一个列表

In [7]:
diff = difflib.ndiff('one\ntwo\nthree\n'.splitlines(1),
                     'ore\ntree\nemu\n'.splitlines(1))
diff = list(diff) 
print(''.join(difflib.restore(diff, 1)))
one
two
three

In [8]:
print(''.join(difflib.restore(diff, 2)))
ore
tree
emu

difflib.unified_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])

比较ab(字符串列表),返回一个unified diff格式的差异结果.

In [9]:
for line in difflib.unified_diff(s1, s2, fromfile='before.py', tofile='after.py'):
     print(line) 
--- before.py

+++ after.py

@@ -1,4 +1,4 @@

-bacon

-eggs

-ham

+python

+eggy

+hamster

 guido

使用 HtmlDiff() 方便查看结果

HtmlDiff() 函数以 HTML 作为输出的格式,与纯文本相对,能够得到很好的可视化效果:

In [10]:
html_dif = difflib.HtmlDiff()

make_file() 则将结果生成完整的 HTML 文件,可以直接打开查看:

In [11]:
with open('xx_diff_full.html', 'w') as fo:
    fo.write(
        html_dif.make_file(s1, s2)
    )

make_table() 函数将比较的结果生成表格,可以与其他程序组合使用:

In [12]:
with open('xx_table_diff.html', 'w') as fo:
    fo.write(
        html_dif.make_table(s1, s2)
    )
  • 1   scikit-learn的简单线性回归
  • 1   计算相关系数(R语言)
  • 1   遥感模型:计算NDVI指数