我的代码中的错误:识别另一个序列中的序列

时间:2015-03-06 12:23:45

标签: python sequence biopython

我目前的代码:

import re
from Bio.Seq import Seq


def check_promoter(binding_element,promoter_seq):
promoter_seq = str(promoter_seq)
        residues = list()
        for i in range(0,len(promoter_seq)):
            if binding_element[0] == promoter_seq[i]:
                ind = promoter_seq[i]
                for j in range(0,len(binding_element)):
                    if binding_element[0+j] == promoter_seq[i+j-len(binding_element)]:
                        residues.append(i+j-len(binding_element))
        return residues 


ESR1_promoter = Seq('''aagtcaggctgagagaatctcagaaggttgtggaagggtctatctacttt\
gggagcattttgcagaggaagaaactgaggtcctggcaggttgcattctc\
ctgatggcaaaatgcagctcttcctatatgtataccctgaatctccgccc\
ccttcccctcagatgccccctgtcagttcccccagctgctaaatatagct\
gtctgtggctggctgcgtatgcaaccgcacaccccattctatctgcccta\
tctcggttacagtgtagtcctccccagggtcatcctatgtacacactacg\
tatttctagccaacgaggagggggaatcaaacagaaagagagacaaacag\
agatatatcggagtctggcacggggcacataaggcagcacattagagaaa\
gccggcccctggatccgtctttcgcgtttattttaagcccagtcttccct\
gggccacctttagcagatcctcgtgcgcccccgccccctggccgtgaaac\
tcagcctctatccagcagcgacgacaagtaaagtaaagttcagggaagct\
gctctttgggatcgctccaaatcgagttgtgcctggagtgatgtttaagc\
caatgtcagggcaaggcaacagtccctggccgtcctccagcacctttgta\
atgcatatgagctcgggagaccagtacttaaagttggaggcccgggagcc\
caggagctggcggagggcgttcgtcctgggactgcacttgctcccgtcgg\
gtcgcccggcttcaccggacccgcaggctcccggggcagggccggggcca\
gagctcgcgtgtcggcgggacatgcgctgcgtcgcctctaacctcgggct\
gtgctctttttccaggtggcccgccggtttctgagccttctgccctgcgg\
ggacacggtctgcaccctgcccgcggccacggaccatgaccatgaccctc\
cacaccaaagcatctgggatggccctactgcatcagatccaagggaacga''')
ESR1_complement = ESR1_promoter.complement()

SBE = 'CAGACA'

print check_promoter(SBE,ESR1_promoter)
print check_promoter(SBE,ESR1_complement)

当我使用字符串'aa'进行测试并且返回找到'aa'的索引列表但当我使用其他序列(即'tcc')进行测试时,它会发现没有匹配'tcc'在序列中。此外,字符串'CAGACA'在补码字符串中使用re.findall方法进行标识,但这不提供索引。

有人能说出我做错了吗?

另外,第二个问题 - 你可以看到我已经作弊了一点,因为我的代码只会检查第一个:

promoter_seq[i+j-len(binding_element)]

元素,因为我得到索引错误。有人知道解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:3)

我很惊讶Bio中没有预先存在的功能来执行此类搜索 - 这似乎是一种非常常见的操作。也许您需要花一些时间阅读文档。

无论如何,你可以使用re.finditer()来返回一个返回匹配对象的迭代器:

import re
from Bio.Seq import Seq

def check_promoter(binding_element, promoter_seq):
    return [m.start() for m in
               re.finditer(str(binding_element).lower(),
                           str(promoter_seq).lower())]

ESR1_promoter = Seq('aagtcaggctgagagaatctcagaaggttgtggaagggtctatctactttgggagcattttgcagaggaagaaactgaggtcctggcaggttgcattctcctgatggcaaaatgcagctcttcctatatgtataccctgaatctccgcccccttcccctcagatgccccctgtcagttcccccagctgctaaatatagctgtctgtggctggctgcgtatgcaaccgcacaccccattctatctgccctatctcggttacagtgtagtcctccccagggtcatcctatgtacacactacgtatttctagccaacgaggagggggaatcaaacagaaagagagacaaacagagatatatcggagtctggcacggggcacataaggcagcacattagagaaagccggcccctggatccgtctttcgcgtttattttaagcccagtcttccctgggccacctttagcagatcctcgtgcgcccccgccccctggccgtgaaactcagcctctatccagcagcgacgacaagtaaagtaaagttcagggaagctgctctttgggatcgctccaaatcgagttgtgcctggagtgatgtttaagccaatgtcagggcaaggcaacagtccctggccgtcctccagcacctttgtaatgcatatgagctcgggagaccagtacttaaagttggaggcccgggagcccaggagctggcggagggcgttcgtcctgggactgcacttgctcccgtcgggtcgcccggcttcaccggacccgcaggctcccggggcagggccggggccagagctcgcgtgtcggcgggacatgcgctgcgtcgcctctaacctcgggctgtgctctttttccaggtggcccgccggtttctgagccttctgccctgcggggacacggtctgcaccctgcccgcggccacggaccatgaccatgaccctccacaccaaagcatctgggatggccctactgcatcagatccaagggaacga')
ESR1_complement = ESR1_promoter.complement()

SBE = 'CAGACA'

>>> check_promoter(SBE, ESR1_promoter)
[]
>>> check_promoter(SBE, ESR1_complement)
[200]
>>> check_promoter('tcc', ESR1_promoter)
[80, 98, 121, 143, 153, 177, 267, 270, 282, 413, 445, 467, 510, 565, 622, 632, 635, 723, 741, 778, 860, 948, 987]
>>> check_promoter('TCC', ESR1_promoter)
[80, 98, 121, 143, 153, 177, 267, 270, 282, 413, 445, 467, 510, 565, 622, 632, 635, 723, 741, 778, 860, 948, 987]

>>> check_promoter(Seq('CAGACA'), ESR1_complement)

请注意,binding_element可以是Seq或字符串,并且区分大小写,因此会将其转换为小写,以便按promoter_seq进行搜索。