- 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 中) from difflib import SequenceMatcher as sm class myint(int): def __cmp__(s
我正在尝试使用 Python 的 SequenceMatcher 查找两个字符串之间的匹配 block 。字符串为 "ABCDPQRUVWXYZ" 和 "PQRABCDUVWXYZ"。但是,当我应用
我试图将一组字符串与一组已定义的字符串进行比较。例如,您想要查找一封信件的收件人,该信件的文本通过 OCR 数字化。 有一个地址数组,其中有字典作为元素。每个元素都是唯一的,包含 ID、姓名、街道、邮
我修补了一个列表,使其看起来像另一个列表: a = [x for x in "qabxcd"] b = [x for x in "abycdf"] c = a[:] s = SequenceMatch
在 Python 中解压 SequenceMatcher 循环结果以便轻松访问和处理值的最佳方法是什么? from difflib import * orig = "1234567890" comme
想知道解决这个特定问题的最佳方法以及是否有任何库(最好是 python,但如果需要我可以灵活处理)。 我有一个文件,每一行都有一个字符串。我想找到最长的常见模式及其在每一行中的位置。我知道我可以使用
import difflib a='abcd' b='ab123' seq=difflib.SequenceMatcher(a=a.lower(),b=b.lower()) seq=difflib.S
我正在寻找一种比较两个字符串的方法。但不是简单的 equals()。我需要一些指标来说明那些与 String 匹配的可能性有多大。因此,例如(值是一个未计算的猜测): 《汽车》和《汽车》重播1.0 “
我想在 Python 中生成文本修订(更具体地说,Markdown 格式的文章)之间的差异。 我想以类似于 Github 的方式格式化此差异 我查看了 difflib 并发现它可以满足我的要求。但是,
我正在做一个项目,它从我存储在 2 个文本文件(nyt.text 和 wapo.text)中的报纸网站获取标题并比较它们相互比较,如果字符串被 Python 内置的 SequenceMatcher 确
我正在使用 difflib 来识别较长序列中短字符串的所有匹配项。然而,当有多个匹配项时,difflib 似乎只返回一个: > sm = difflib.SequenceMatcher(None, a
我一直在尝试使用 SequenceMatcher 创建嵌套或递归效果。 最终目标是比较两个序列,它们都可能包含不同类型的实例。 例如,序列可以是: l1 = [1, "Foo", "Bar", 3]
我对 SequenceMatcher 返回的两个不同答案感到有点困惑取决于参数的顺序。为什么会这样? 例子 SequenceMatcher 不可交换: >>> from difflib import
在 python difflib 库中,SequenceMatcher 类的行为是否异常,或者我误读了假定的行为是什么? 为什么 isjunk 参数在这种情况下似乎没有任何区别? difflib.Se
我在试用 python 的 difflib 模块时遇到了 SequenceMatcher。因此,我尝试了以下示例,但无法理解发生了什么。 >>> SequenceMatcher(None,"abc",
我正在尝试使用 SequenceMatcher.ratio()获取两个字符串的相似度:"86418648"和 "86488648" : >>> SequenceMatcher(None,"864186
我正在使用 difflib 比较两个目录中的文件(连续年份的版本)。首先,我使用 filecmp 查找已更改的文件,然后迭代使用 difflib.SequenceMatcher 比较它们并生成 htm
我试图弄清楚是否有一种方法可以根据 difflib SequenceMatcher 比例对 Pandas 中的字符串进行模糊合并。基本上,我有两个数据框,如下所示: df_a company a
我想使用 difflib.SequenceMatcher 从两个字符串中提取最长的公共(public)子字符串。我不确定我是发现了错误还是误解了 find_longest_match 的文档。这是我感
我正在尝试使用 Difflib.SequenceMatcher 来计算两个文件之间的相似性。这两个文件几乎完全相同,只是一个文件包含一些额外的空格、空行而另一个则没有。我正在尝试使用 s=diffli
我是一名优秀的程序员,十分优秀!