- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 difflib.SequenceMatcher
从两个字符串中提取最长的公共(public)子字符串。我不确定我是发现了错误还是误解了 find_longest_match
的文档。这是我感到困惑的一点:
In other words, of all maximal matching blocks, return one that starts earliest in a, and of all those maximal matching blocks that start earliest in a, return the one that starts earliest in b.
( https://docs.python.org/3.5/library/difflib.html#difflib.SequenceMatcher.find_longest_match )
比较字符串 X this is a test
和 this is a test X
,子字符串 X
实际上是 maximal block :它不能被扩展(即,它是包含最大的)。此外,它是文本 A 中第一个这样的最大块。但它肯定不是最长公共(public)子串。我强烈怀疑这不是 find_longest_match
应该找到的。
事实上,在这个例子中,find_longest_match
确实找到了一个最长的公共(public)子串:
>>> 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)
但是,对于其他一些字符串,我似乎可以激发“找到第一个最大块”- 上述行为(对于长字符串很抱歉,如果我缩短它们,示例会以某种方式中断):
>>> s1 = "e-like graph visualization using a spanning tree-driven layout technique with constraints specified by layers and the ordering of groups of nodes within layers. We propose a new method of how the orde"
>>> s2 = "itree graph visualization using a spanning tree-driven layout technique with constraints speci ed by layers and the ordering of groups of nodes within layers. We propose a new method of how the drivin"
>>> matcher = difflib.SequenceMatcher(None, s1, s2)
>>> matcher.find_longest_match(1, 149, 5, 149)
Match(a=1, b=47, size=1)
在这种情况下,它将 s1[1]
中的第一个 -
匹配到 s2[47]< 中的
,就是这样。最长的公共(public)子串可能是以 -
/graph visualization using ...
我是否发现了错误,或者描述此行为的文档是否有另一种可能的解释?
我在 Ubuntu 上使用 Python 3.5.2。
最佳答案
好吧,我明白了。如果有人遇到同样的问题:SequenceMatcher
有一个 autojunk
参数会做奇怪的事情:
The heuristic counts how many times each individual item appears in the sequence. If an item’s duplicates (after the first one) account for more than 1% of the sequence and the sequence is at least 200 items long, this item is marked as “popular” and is treated as junk for the purpose of sequence matching.
据我所知,匹配器永远不会找到包含任何“垃圾”的匹配项。不知道为什么这很有用,但默认情况下它是启用的。这也解释了为什么当我缩短字符串时上面的示例会中断。然而,它确实大大加快了 LCS 搜索的速度。
因此,总而言之:您可能希望在构造函数中传递 autojunk=False
。
关于Python Difflib 的 SequenceMatcher 没有找到最长公共(public)子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51059536/
我在 python 的 difflib 库中遇到了一个非常奇怪的问题。我有两个字符串,如下所示,我对它们运行 get_opcodes ,如下所示: import difflib str1 = "Mat
有谁知道为什么这两个返回不同的比率。 >>> import difflib >>> difflib.SequenceMatcher(None, '10101789', '11426089').rati
我正在使用这段代码来查找两个 csv 列表之间的差异,并提出一些格式问题。这可能是一个简单的修复方法,但我是新手,正在尝试学习并遇到很多问题。 import difflib diff=diffli
在带有 difflib 的 python 中有没有一种方法可以获取更改的偏移量以及更改本身? 我有以下内容: import difflib text1 = 'this is a sample text
我可以在 difflib 中使用正则表达式吗? 具体来说,我想做的是: difflib.context_diff(actual, gold) 实际位置: [master 92a406f] file m
我对 python 完全陌生,我需要一些关于 difflib 的帮助。我尝试阅读文档,但对我来说理解文档并不容易。 我想比较两个字符串,并且我希望输出仅是两个字符串之间的匹配前缀部分(不打印差异)。
import difflib test1 = ")\n )" test2 = "#)\n #)" d = difflib.Differ() diff = d.compare(test1.splitli
根据此处的 Python 文档:https://docs.python.org/2/library/difflib.html ,当我比较两个序列时,如果该行对于序列 1 是唯一的,则会附加“+”,对于
我想使用以下代码从 C# 执行 python 代码。 static void Main(string[] args) { ScriptEngine engine = Py
我在 Python 中使用 difflib,但在使输出看起来不错时遇到了一些困难。出于某种奇怪的原因,difflib 在每个字符前添加了一个空格。例如,我有一个如下所示的文件 (textfile01.
是否可以使用与 GNU 补丁兼容的 python 模块 difflib 创建补丁?我尝试使用 unified_diff 和 context_diff,还尝试将 lineterm 指定为“\n”,但我仍
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是
最近工作需要用到序列匹配,检测相似性,不过有点复杂的是输入长度是不固定的,举例为: ?
我需要将潜在客户与我们的客户数据库进行匹配。 潜在客户来自大量的第三方提供商(成千上万笔记录),销售人员要求我们(以他们的话)“过滤掉客户”,这样他们才不会尝试将我们的服务卖给已建立的客户。 显然,潜
我正在寻找一种比较两个字符串的方法。但不是简单的 equals()。我需要一些指标来说明那些与 String 匹配的可能性有多大。因此,例如(值是一个未计算的猜测): 《汽车》和《汽车》重播1.0 “
根据文档,您可以提供一个 linejunk 函数来忽略 certian 行。但是,我无法让它工作。以下是一些供讨论的示例代码: from re import search from difflib i
我需要帮助尝试使用 difflib 比较两个字典。我的程序需要 2 个 json 文件,将它们转换为 python 字典。然后我想在两个字典上使用 difflib 来显示两者之间的差异。 使用 dif
根据文档,您可以提供一个 linejunk 函数来忽略某些行。但是,我无法让它工作。以下是一些供讨论的示例代码: from re import search from difflib import n
使用 PyMOTW 给出的两个文本, difflib.HtmlDiff.make_file() 用于生成 HTML 输出。然而,当在浏览器中保存并打开时,会显示原始 HTML,而不是呈现为预期的表格。
正在下载this页面并对其进行较小的编辑,将本段中的第一个 65 更改为 68: 然后,我使用 BeauifulSoup 解析两个源,并使用 difflib 区分它们。 url = 'https://
我是一名优秀的程序员,十分优秀!