寻找序列中的模式

1 投票
3 回答
8669 浏览
提问于 2025-04-18 00:34

我想找一个算法,用来在我的长DNA序列(存储在一个字符串对象中)里搜索特定的短DNA片段(也就是我们说的motifs),然后统计每个找到的片段的数量(假设我的序列中有几个相同的片段),并打印出每个片段在序列中首次出现的位置。

我假设在下面定义的每个对象中,我需要在某个循环里进行这样的搜索,因为下面的例子只能找到片段一次。那么,应该如何正确地设置这个循环呢?

#Loading data
seq = open('motif.txt', 'r')
chains=[]
[chains.append(line[:-1]) for line in seq]
Seq,Motif = chains[0], chains[1]
count=0


# Search motif
Seq.find(Motif)

if y == 1:
    print "%s has been detected" %(Motif)

if Motif in Seq:
    print "%s has been detected" %(Motif)

3 个回答

0

我把这个作为另一个答案,因为我不能发表评论...

不过,我觉得你可以在这个问题里找到答案:Python 正则表达式如何找到所有重叠的匹配项?

1

这个问题在用词上让我觉得有点模糊。你提到你在寻找“模式”,我想问问你,是不是在找一个确切的序列,还是说你想找转录因子结合位点(TFBS)。如果你是在找某个特定字符串的确切出现,那么@CT Zhu的回答就是适合你的。

不过,如果你是在找转录因子结合位点,那就没那么简单了,因为这些序列是变异的,不一定总是对应同一个序列,尽管它们有一些共同的模式。在这种情况下,我建议你看看一些模式数据库,比如Jaspar或TRANSFAC,或者Biopython的“motifs”模块可能是个不错的起点: http://biopython.org/DIST/docs/api/Bio.motifs-module.html

如果你想了解更复杂的寻找模式的方法,可以查阅一些文献: http://www.ploscompbiol.org/article/info%3Adoi%2F10.1371%2Fjournal.pcbi.1003214#pcbi-1003214-g008

2

有没有什么现成的工具可以做到这一点呢?比如说 biopython?不过其实这并不难,你也不需要用循环:

import re

seq='aaattatagggatatata'

motif='ata'

Q=re.compile(motif)

[item.start(0) for item in Q.finditer(seq)] #or maybe item.start(0)+1 if you want it
#Out[23]: [5, 11, 15]

撰写回答