编程语言
首页 > 编程语言> > python – 如何使用difflib.SequenceMatcher获取多个匹配项?

python – 如何使用difflib.SequenceMatcher获取多个匹配项?

作者:互联网

我使用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返回两个位置.

解决方法:

正如Jerry指出的那样,k-nut正确回答,你使用了错误的算法来解决你的问题.
老实说k-nut的答案并不是那么糟糕,但它并不是解决这类问题最有效的方法.
我是一名生物信息学家并且给出了您的问题和示例案例,看起来非常像您正在尝试解决“我们的”经典DNA序列比对/搜索问题(请参阅由Altschul或“Gene”Myers等科学超级明星撰写的scientific literature如果您对细节感兴趣并希望阅读有史以来被引用次数最多的论文之一,那就是问题所在.

在有效的长段数据库中查找短段正是Altschul现在着名的BLAST算法启发式解决和/或可以使用Smith-Waterman进行精确查找.
在Python中执行此操作的最有效方法可能是使用BioPython,特别是,您可能希望查看描述如何设置local NCBI BLAST+ instance的部分.
如果你没有与Python“结婚”,那么今天的BLAST实现速度更快,比如FSA-BLAST.

另一方面,如果你需要精确的匹配(而不是BLAST的启发式),如果你不介意长查询时间并且有一个小的参考序列(在你的例子中是B),你可能会这样.与官方史密斯 – 沃特曼(SW)对齐.如果没有,并且您仍需要完全匹配,则首先过滤与BLAST匹配,然后使用候选的SW对齐减少您的设置.

您可以在纯Python中实现SW,甚至只使用任何现有的纯Python实现,但我只建议这条路径纯粹用于教育目的(例如,在GitHub上查看swalign).如果你想要一个相当强大的基于Python的实现,请查看scikit-bio的SW对齐,尽管scikit-bio仍然处于alpha状态.但首先要阅读上面已经链接过的SW WikiPedia page,根据你的硬件,你可能会在CUDAC++使用GPU或至少SIMD优化的实现.如果你想要一个带有Python包装的漂亮版本,请检查淘汰SSWlib.

标签:python,regex,difflib
来源: https://codeday.me/bug/20190623/1275374.html