标签: difflib

Python Difflib增量和比较Ndiff

我一直想做一些类似的事情,就像我相信变更控制系统所做的那样,它们比较两个文件,并在每次文件更改时保存一个小的差异。我一直在阅读此页面:http : //docs.python.org/library/difflib.html,它显然并没有陷入我的脑海。

我试图在下面显示的一个简单程序中重新创建它,但是我似乎缺少的是Delta包含的内容至少与原始文件一样多,甚至更多。

不可能只进行纯粹的改变吗?我要求的原因很明显-节省磁盘空间。
我每次都可以保存整个代码块,但是最好先保存一次当前代码,然后再进行少量更改。

我还在尝试找出为什么许多difflib函数返回一个生成器而不是一个列表,那有什么好处?

difflib对我有用吗?还是我需要找到一个具有更多功能的更专业的软件包?

# Python Difflib demo 
# Author: Neal Walters 
# loosely based on http://ahlawat.net/wordpress/?p=371
# 01/17/2011 

# build the files here - later we will just read the files probably 
file1Contents="""
for j = 1 to 10: 
   print "ABC"
   print "DEF" 
   print "HIJ"
   print "JKL"
   print "Hello World"
   print "j=" + j 
   print "XYZ"
"""

file2Contents = """
for j = 1 to 10: 
   print "ABC"
   print "DEF" 
   print "HIJ"
   print …
Run Code Online (Sandbox Code Playgroud)

python difflib delta

4
推荐指数
1
解决办法
1万
查看次数

如何使用Django比较两个要用Markdown渲染的模型?

在两个帖子的版本(原始版本和编辑版本)之间的帖子中检查更改(编辑/添加/删除的文本)的最佳方法是什么?

我正在使用Markdown所以我不确定是否使用difflib.HtmlDiff是一个好主意.我的目标是用绿色背景标记添加的文本,用红色背景标记删除的文本,类似于github所做的.

python django version-control markdown difflib

4
推荐指数
1
解决办法
388
查看次数

Python 的 difflib SequenceMatcher 加速

我正在使用 difflib SequenceMatcher(ratio() 方法)来定义文本文件之间的相似性。虽然 difflib 比较一小组文本文件的速度相对较快,例如 10 个 70 kb 的文件平均相互比较(46 次比较)需要大约 80 秒。

这里的问题是我收集了 3000 个 txt 文件(平均 75 kb),对 SequenceMatcher 完成比较工作需要多长时间的原始估计是 80 天!

我尝试了“real_quick_ratio()”和“quick_ratio()”方法,但它们不适合我们的需求。

有没有办法加快比较过程?如果没有,有没有其他更快的方法来完成这样的任务?即使它不在 Python 中。

python performance difflib python-2.7

4
推荐指数
3
解决办法
4123
查看次数

Python Difflib的SequenceMatcher找不到最长的公共子字符串

我想用来difflib.SequenceMatcher从两个字符串中提取最长的公共子字符串。我不确定是否发现错误或对的文档有误解find_longest_match。这一点令我感到困惑:

换句话说,在所有最大匹配块中,返回最早在a中开始的一个,在所有最大匹配块中最早在a中开始的,返回最早在b中的一个。

https://docs.python.org/3.5/library/difflib.html#difflib.SequenceMatcher.find_longest_match

比较字符串X this is a testthis is a test X,子字符串X实际上是一个最大的块:它不能扩展(即,它是包含最大的)。此外,它是文本A中的第一个此类最大块。但是,它肯定不是最长的公共子字符串。我强烈怀疑这不是find_longest_match应该找到的。

实际上,在此示例中,find_longest_match确实找到了最长的公共子字符串:

>>> l = len("X this is a test")
>>> matcher = difflib.SequenceMatcher(None, "X this is a test", "this is a test X")
>>> matcher.find_longest_match(0, l, 0, l)
Match(a=2, b=0, size=14)
Run Code Online (Sandbox Code Playgroud)

但是,对于其他字符串,我似乎可以挑起上面描述的“查找第一个最大块”(对长字符串,很抱歉,如果我将它们缩短,示例会以某种方式中断):

>>> s1 = "e-like graph visualization using a spanning tree-driven layout technique with constraints specified by layers and …
Run Code Online (Sandbox Code Playgroud)

python difflib longest-substring

4
推荐指数
1
解决办法
452
查看次数

使用 difflib.HtmlDiff 类 - 显示单个字符

我正在使用difflib.HtmlDiff该类,使用两组文本(来自网站的 HTML)调用该函数,但是当它制作表格时

html_diff = difflib.HtmlDiff()
print html_diff.make_table(previous_contents, fetch_url.page_contents)
Run Code Online (Sandbox Code Playgroud)

然而,这似乎只是逐个字符地比较(每表行 1 个字符),我最终得到了一个 4.3MB 的 txt 文件,用于两组只有 100k 的 html。

文档文件说,

Compares fromlines and tolines (lists of strings) and returns a string which is a 
complete HTML file containing a table showing line by line differences with 
inter-line and intra-line changes highlighted.
Run Code Online (Sandbox Code Playgroud)

然而,情况似乎并非如此。

有什么建议?

python difflib

3
推荐指数
1
解决办法
3517
查看次数

如何通过最佳匹配(difflib比率)对字符串列表进行排序

让我们说我正在建立各种各样的基本搜索引擎.我有一个字符串列表作为搜索结果,我想在顶部订购具有最佳匹配结果的搜索结果列表.

我当前的代码看起来像这样(命名参数作为示例)

import difflib
def order_by_best_match(search_results=["spam", "eggs", "spammy", "eggy"], search_query="spam"):

    for result in search_results:
        ratio = difflib.SequenceMatcher(None, result, search_query).ratio()
Run Code Online (Sandbox Code Playgroud)

之后我不知道该怎么办ratio.我知道我必须对列表进行排序ratio,但我该怎么做呢?

python sorting list difflib

3
推荐指数
1
解决办法
3905
查看次数

更好的模糊匹配性能?

我目前使用的方法get_close_matches从法difflib迭代通过15000个字符串列表以获得对大约15000串的另一个列表最接近的匹配:

a=['blah','pie','apple'...]
b=['jimbo','zomg','pie'...]

for value in a:
    difflib.get_close_matches(value,b,n=1,cutoff=.85)
Run Code Online (Sandbox Code Playgroud)

每个值需要 0.58 秒,这意味着完成循环需要 8,714 秒或 145 分钟。是否有其他库/方法可能更快或提高此方法的速度?我已经尝试将两个数组转换为小写,但它只会导致速度略有增加。

python performance fuzzy-comparison difflib levenshtein-distance

3
推荐指数
2
解决办法
5667
查看次数

difflib 无法正确找到操作码

我在 python 的 difflib 库中遇到了一个非常奇怪的问题。我有两个字符串,如下所示,我get_opcodes像这样运行它们:

import difflib

str1 = "MatrixElement(MatrixSymbol('Btd', Integer(11), Integer(11)), Integer(0), Integer(9))), Mul(Float('1.0', precision=24), MatrixElement(MatrixSymbol('Btd', Integer(11), Integer(11)), Integer(0), Integer(10))))"
str2 = "MatrixElement(MatrixSymbol('Btd', Integer(11), Integer(11)), Integer(1), Integer(9))), Mul(Float('1.0', precision=24), MatrixElement(MatrixSymbol('Btd', Integer(11), Integer(11)), Integer(1), Integer(10))))"
difflib.SequenceMatcher(None, str1,str2).get_opcodes()
Run Code Online (Sandbox Code Playgroud)

仅在这个具体示例中,diff 的输出如下所示,这显然是错误的。

[('equal', 0, 69, 0, 69),
 ('replace', 69, 70, 69, 70),
 ('equal', 70, 188, 70, 188),
 ('insert', 188, 188, 188, 201),
 ('equal', 188, 190, 201, 203),
 ('replace', 190, 206, 203, 206)]
Run Code Online (Sandbox Code Playgroud)

正确的输出不应包含insert操作码,因为没有添加任何新内容。

这可能是 difflib 中的一个错误吗?

python difflib

3
推荐指数
1
解决办法
1542
查看次数

在浏览器中为 diff2html 创建统一的 diff 文本

是否有一个库可以从diff2html可以使用的两个字符串中生成统一的差异?我试过difflib但输出似乎不符合 diff2html 需要的要求。我需要一个 .js 库,我可以在网页中导入以生成 JSON 之间的差异。

尝试使用该lineterm参数,但无法使该工具正常工作。如果我使用文档中的字符串作为示例,那么它可以工作:

--- a/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n+++ b/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (\n \n // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n \n+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n+\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n+\tn = int(r0)\n+\tif e1 != 0 …
Run Code Online (Sandbox Code Playgroud)

javascript unified-diff difflib diff2html

3
推荐指数
1
解决办法
2561
查看次数

更改 difflib.make_file() HTML 表的宽度?

我正在使用 python difflib 和 make_file() 为法律文档创建 diff 文件,它输出包含带有 Diff 的表的 HTML 文件。

但输出表太宽以至于无法读取。

有没有办法改变表格的宽度或从我的函数调用中添加其他CSS?我在文档中找不到任何相关内容。

如果不可能,什么可以解决我的“表格宽度太宽”问题?

我已经尝试添加 bootstrap 并将表格放入响应式 div 中,但它不起作用。

html css python html-table difflib

2
推荐指数
1
解决办法
2491
查看次数