Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用difflib.SequenceMatcher获得多个匹配?_Python_Regex_Difflib - Fatal编程技术网

Python 如何使用difflib.SequenceMatcher获得多个匹配?

Python 如何使用difflib.SequenceMatcher获得多个匹配?,python,regex,difflib,Python,Regex,Difflib,我使用difflib来识别长序列中短字符串的所有匹配项。但是,当存在多个匹配项时,difflib似乎只返回一个: > sm = difflib.SequenceMatcher(None, a='ACT', b='ACTGACT') > sm.get_matching_blocks() [Match(a=0, b=0, size=3), Match(a=3, b=7, size=0)] 我期望的结果是: [Match(a=0, b=0, size=3), Match(a=0, b=4

我使用difflib来识别长序列中短字符串的所有匹配项。但是,当存在多个匹配项时,difflib似乎只返回一个:

> sm = difflib.SequenceMatcher(None, a='ACT', b='ACTGACT')
> sm.get_matching_blocks()
[Match(a=0, b=0, size=3), Match(a=3, b=7, size=0)]
我期望的结果是:

[Match(a=0, b=0, size=3), Match(a=0, b=4, size=3), Match(a=3, b=7, size=0)]
事实上,字符串ACTGACT包含两个匹配的ACT,位置0和4,大小均为3(加上字符串末尾另一个大小为0的匹配)


如何获得多个匹配项?我希望difflib能同时返回两个位置

为什么要使用
difflib
来实现这一点?您应该能够只使用标准正则表达式

import re
pattern = "ACT"
text = "ACTGACT"
matches = [m.span() for m in re.finditer(pattern, text)]
这将给你:

[(0, 3), (4, 7)]

或者出于某种原因,这不包括您感兴趣的信息?当然,它不会返回difflib返回的最后一个空匹配,但您可以轻松地创建它。

正如Jerry指出的,k-nut正确地回答了这一问题,您使用了错误的算法。 老实说,k-nut的答案并不是那么糟糕,但它并不是解决这类问题的最有效方法。 我是一名生物信息学家,考虑到你的问题和这个案例,你似乎很想解决“我们”的经典DNA序列比对/搜索问题(参见Altschul或“Gene”等科学巨星的如果你对细节感兴趣,并且想读一篇有史以来被引用最多的论文之一,你可以在这个问题上发表迈尔斯的文章)

在长片段数据库中高效地查找短片段正是Altschul现在著名的算法通过启发式和/或精确查找解决的问题。 在Python中实现这一点的最有效的方法可能是使用,特别是,您可能希望查看描述如何设置。 如果您没有“嫁给”Python,那么现在BLAST的实现甚至更快,比如

另一方面,如果您需要精确匹配(与BLAST所做的启发式相反),如果您不介意长时间的查询和小的引用序列(
B
,在您的示例中),则可以使用官方的Smith-Waterman(SW)对齐。若并没有,你们仍然需要精确匹配,首先用BLAST过滤匹配,然后用候选的SW对齐减少你们的集合


您可以在纯Python中实现SW,甚至可以只使用任何现有的纯Python实现,但我只建议您使用该路径纯粹出于教育目的(例如,在GitHub上查看)。尽管scikit bio仍处于alpha状态,但如果您仍然想要一个相当强大的基于Python的实现,请检查软件对齐。但是首先阅读上面已经链接的,并且取决于您拥有的硬件,您可以在或中使用GPU或至少SIMD优化的实现。如果您想要一个带有Python包装器的好版本,请查看。

为什么要使用
SequenceMatcher
-我不确定我是否遵循了您的逻辑,为什么您希望3个匹配?我希望序列上有两个匹配(位置0和4),再加上一个大小为0的匹配(请参阅difflib文档-get_matching_blocks总是在序列末尾返回一个大小为0的额外匹配项)difflib的目的是,例如,并排比较两个文本块,并能够指出哪些是常见的,哪些不是(此处的修订工作方式,初始版本与修订版本之间的差异,所有添加和删除都突出显示,常见内容保持未标记)。因此,如果发现ACT在两个字符串中匹配一次,则它不会尝试匹配另一个字符串,除非两个字符串中都有另一个字符串。您的意思是:
matches=[m.span()代表re.finditer(pattern,text)]
?(这将是我要回答的问题,但是OP没有明确说明为什么他们使用
SequenceMatcher
以及为什么空匹配很重要)@JonClements是的,你是对的。很抱歉变量混淆。也使用
span()
似乎是个好主意。不需要完全匹配对象。感谢您的回答,但上面的一个只是一个示例。我需要在大序列中搜索一个短序列,我想看看是否可以使用difflib而不是定义像*C.*G.*这样的模式。然后您能提供一个更精确地显示您的情况的示例吗?