我的代码中的错误:识别另一个序列中的序列
Bug in my code: identifying sequence within another sequence
我当前的代码:
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' 和 returns 测试找到 'aa' 的索引列表但当我使用其他序列(即 'tcc') 当序列中明显有 'tcc' 时,它找不到匹配项。此外,字符串 'CAGACA' 在补串中用 re.findall 方法识别,但这不提供索引。
有人可以指出我做错了什么吗?
此外,还有一个次要问题 - 如您所见,我作弊了一点,因为我的代码只会检查第一个:
promoter_seq[i+j-len(binding_element)]
个元素,因为我收到索引错误。有人知道解决这个问题的方法吗?
谢谢
令我惊讶的是 Bio
中没有预先存在的函数来执行此类搜索 - 这似乎是一种非常常见的操作。也许您需要花一些时间阅读文档。
无论如何,您可以只使用 re.finditer()
,它将 return 一个迭代器 return 匹配对象:
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
。
我当前的代码:
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' 和 returns 测试找到 'aa' 的索引列表但当我使用其他序列(即 'tcc') 当序列中明显有 'tcc' 时,它找不到匹配项。此外,字符串 'CAGACA' 在补串中用 re.findall 方法识别,但这不提供索引。
有人可以指出我做错了什么吗?
此外,还有一个次要问题 - 如您所见,我作弊了一点,因为我的代码只会检查第一个:
promoter_seq[i+j-len(binding_element)]
个元素,因为我收到索引错误。有人知道解决这个问题的方法吗?
谢谢
令我惊讶的是 Bio
中没有预先存在的函数来执行此类搜索 - 这似乎是一种非常常见的操作。也许您需要花一些时间阅读文档。
无论如何,您可以只使用 re.finditer()
,它将 return 一个迭代器 return 匹配对象:
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
。