试图在大字符串中查找子字符串
Trying to find substrings in large string
给定这个字符串
dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC"
以下代码应打印以下 4 个子字符串。
ATGTAA
ATGAATGACTGATAG
ATGCTATGA
ATGTGA
但是,它正在打印以下内容:
ATGTAA
ATGAATGACTGATAG
ATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC
ATGCTTGTATGCTATGAAAATGTGAAATGACCC
ATGCTATGA
ATGAAAATGTGA
ATGTGA
ATGACCC
None
请有人帮我解决这个问题。谢谢。
def findStopIndex(dna,index):
stop1 = dna.find("tga",index)
if(stop1 == -1 or (stop1-index) % 3 != 0):
stop1 = len(dna)
stop2 = dna.find("taa",index)
if(stop2 == -1 or (stop2-index) % 3 != 0):
stop2 = len(dna)
stop3 = dna.find("tag",index)
if(stop3 == -1 or (stop3-index) % 3 != 0):
stop3 = len(dna)
return min(stop1, min(stop2,stop3))
def printAll(dna):
gene = None
start = 0
while(True):
loc = dna.find("atg", start)
if(loc == -1):break
stop = findStopIndex(dna,loc+3)
gene = dna[loc:stop+3]
print gene.upper()
start = loc + 3
print printAll(dna3.lower())
变化:
1) min 应该使用 "key=int" 否则排序将作为字符串完成...
return min(stop1,stop2,stop3, key=int)
2) break 替换为 exit 以避免 while
的另一个循环
我认为你可以更好地解释它,但要得到你想要得到的东西,你不能 return 那样做,否则你必须以其他方式对待它。你得到的长链是因为你 returning '60' 这是整个序列的长度。我稍微修改了代码,它只拾取以 'tga'、'taa' 或 'tag'.
之一结尾的序列
def findStopIndex(dna, index):
stop1 = dna.find("tga", index)
if (stop1 == -1 or (stop1 - index) % 3 != 0):
stop1 = len(dna)
stop2 = dna.find("taa", index)
if (stop2 == -1 or (stop2 - index) % 3 != 0):
stop2 = len(dna)
stop3 = dna.find("tag", index)
if (stop3 == -1 or (stop3 - index) % 3 != 0):
stop3 = len(dna)
end_sequence = min(stop1, stop2, stop3)if min(stop1, stop2, stop3) < 60 else None
return end_sequence
def printAll(dna):
start = 0
while True:
loc = dna.find("atg", start)
if loc == -1:
break
stop = findStopIndex(dna, loc + 3)
if stop:
gene = dna[loc:stop+3]
print(gene.upper())
start = loc + 3
return
printAll(dna3.lower())
输出:
ATGTAA
ATGAATGACTGATAG
ATGCTATGA
ATGAAAATGTGA
ATGTGA
我们可能需要一些关于 DNA 结构的额外信息。从你的描述来看,感觉子串不能相互重叠。在这种情况下,您需要将 start = loc + 3
替换为 start = stop + 3
(这些字符似乎是 3 组 3 ,也基于您所描述的内容)。
最后,您不需要 print printAll(dna3.lower())
中的 print
,因为它会在您的结果集末尾显示 None
(该函数没有 return值)。
经过这些修改,我的输出是:
ATGTAA
ATGAATGACTGATAG
ATGCTTGTATGCTATGAAAATGTGAAATGACCC
希望对您有所帮助。
将 start = loc + 3 更改为
开始 = loc +len(基因)+ 3
def findStopIndex(dna,index):
stop1 = dna.find("tga",index)
if(stop1 == -1 or (stop1-index) % 3 != 0):
stop1 = len(dna)
stop2 = dna.find("taa",index)
if(stop2 == -1 or (stop2-index) % 3 != 0):
stop2 = len(dna)
stop3 = dna.find("tag",index)
if(stop3 == -1 or (stop3-index) % 3 != 0):
stop3 = len(dna)
return min(stop1, min(stop2,stop3))
def printAll(dna):
gene = None
start = 0
while(True):
loc = dna.find("atg", start)
if(loc == -1):break
stop = findStopIndex(dna,loc+3)
gene = dna[loc:stop+3]
print gene.upper()
start = loc +len(gene)+ 3
dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC"
printAll(dna3.lower())
我认为,您不想要导致将字符串打印到最后的结果,因此您必须排除这些情况。
最好对所有结尾使用 for 循环:
def findStopIndex(dna, index):
stops = []
for tag in ["TGA", "TAA", "TAG"]:
stop = dna.find(tag, index)
if stop >= 0 and (stop - index) % 3 == 0:
stops.append(stop)
return min(stops)
def printAll(dna):
dna = dna.upper()
start = 0
while True:
loc = dna.find("ATG", start)
if loc == -1:
break
try:
stop = findStopIndex(dna, loc + 3)
except ValueError:
# no ending found
pass
else:
print(dna[loc:stop+3])
start = loc + 3
printAll(dna3)
但我认为,您真正想要的是找到 TGA、TAA 和 TAG 之一,即使 TGA 出现在不能被 3 整除的位置上。这可以通过正则表达式来完成:
import re
def printAll(dna):
dna = dna.upper()
start = 0
while True:
mtch = re.search("ATG(...)*?(TGA|TAA|TAG)", dna[start:])
if not mtch:
break
print(mtch.group())
start += mtch.start() + 3
printAll(dna3)
并导致另外两次出现:
ATGTAA
ATGAATGACTGA
ATGACTGATAGATATGCTTGTATGCTATGA
ATGCTTGTATGCTATGAAAATGTGAAATGA
ATGCTATGA
ATGAAAATGTGA
ATGTGA
给定这个字符串
dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC"
以下代码应打印以下 4 个子字符串。
ATGTAA
ATGAATGACTGATAG
ATGCTATGA
ATGTGA
但是,它正在打印以下内容:
ATGTAA
ATGAATGACTGATAG
ATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC
ATGCTTGTATGCTATGAAAATGTGAAATGACCC
ATGCTATGA
ATGAAAATGTGA
ATGTGA
ATGACCC
None
请有人帮我解决这个问题。谢谢。
def findStopIndex(dna,index):
stop1 = dna.find("tga",index)
if(stop1 == -1 or (stop1-index) % 3 != 0):
stop1 = len(dna)
stop2 = dna.find("taa",index)
if(stop2 == -1 or (stop2-index) % 3 != 0):
stop2 = len(dna)
stop3 = dna.find("tag",index)
if(stop3 == -1 or (stop3-index) % 3 != 0):
stop3 = len(dna)
return min(stop1, min(stop2,stop3))
def printAll(dna):
gene = None
start = 0
while(True):
loc = dna.find("atg", start)
if(loc == -1):break
stop = findStopIndex(dna,loc+3)
gene = dna[loc:stop+3]
print gene.upper()
start = loc + 3
print printAll(dna3.lower())
变化:
1) min 应该使用 "key=int" 否则排序将作为字符串完成...
return min(stop1,stop2,stop3, key=int)
2) break 替换为 exit 以避免 while
的另一个循环我认为你可以更好地解释它,但要得到你想要得到的东西,你不能 return 那样做,否则你必须以其他方式对待它。你得到的长链是因为你 returning '60' 这是整个序列的长度。我稍微修改了代码,它只拾取以 'tga'、'taa' 或 'tag'.
之一结尾的序列def findStopIndex(dna, index):
stop1 = dna.find("tga", index)
if (stop1 == -1 or (stop1 - index) % 3 != 0):
stop1 = len(dna)
stop2 = dna.find("taa", index)
if (stop2 == -1 or (stop2 - index) % 3 != 0):
stop2 = len(dna)
stop3 = dna.find("tag", index)
if (stop3 == -1 or (stop3 - index) % 3 != 0):
stop3 = len(dna)
end_sequence = min(stop1, stop2, stop3)if min(stop1, stop2, stop3) < 60 else None
return end_sequence
def printAll(dna):
start = 0
while True:
loc = dna.find("atg", start)
if loc == -1:
break
stop = findStopIndex(dna, loc + 3)
if stop:
gene = dna[loc:stop+3]
print(gene.upper())
start = loc + 3
return
printAll(dna3.lower())
输出:
ATGTAA
ATGAATGACTGATAG
ATGCTATGA
ATGAAAATGTGA
ATGTGA
我们可能需要一些关于 DNA 结构的额外信息。从你的描述来看,感觉子串不能相互重叠。在这种情况下,您需要将 start = loc + 3
替换为 start = stop + 3
(这些字符似乎是 3 组 3 ,也基于您所描述的内容)。
最后,您不需要 print printAll(dna3.lower())
中的 print
,因为它会在您的结果集末尾显示 None
(该函数没有 return值)。
经过这些修改,我的输出是:
ATGTAA
ATGAATGACTGATAG
ATGCTTGTATGCTATGAAAATGTGAAATGACCC
希望对您有所帮助。
将 start = loc + 3 更改为 开始 = loc +len(基因)+ 3
def findStopIndex(dna,index):
stop1 = dna.find("tga",index)
if(stop1 == -1 or (stop1-index) % 3 != 0):
stop1 = len(dna)
stop2 = dna.find("taa",index)
if(stop2 == -1 or (stop2-index) % 3 != 0):
stop2 = len(dna)
stop3 = dna.find("tag",index)
if(stop3 == -1 or (stop3-index) % 3 != 0):
stop3 = len(dna)
return min(stop1, min(stop2,stop3))
def printAll(dna):
gene = None
start = 0
while(True):
loc = dna.find("atg", start)
if(loc == -1):break
stop = findStopIndex(dna,loc+3)
gene = dna[loc:stop+3]
print gene.upper()
start = loc +len(gene)+ 3
dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC"
printAll(dna3.lower())
我认为,您不想要导致将字符串打印到最后的结果,因此您必须排除这些情况。 最好对所有结尾使用 for 循环:
def findStopIndex(dna, index):
stops = []
for tag in ["TGA", "TAA", "TAG"]:
stop = dna.find(tag, index)
if stop >= 0 and (stop - index) % 3 == 0:
stops.append(stop)
return min(stops)
def printAll(dna):
dna = dna.upper()
start = 0
while True:
loc = dna.find("ATG", start)
if loc == -1:
break
try:
stop = findStopIndex(dna, loc + 3)
except ValueError:
# no ending found
pass
else:
print(dna[loc:stop+3])
start = loc + 3
printAll(dna3)
但我认为,您真正想要的是找到 TGA、TAA 和 TAG 之一,即使 TGA 出现在不能被 3 整除的位置上。这可以通过正则表达式来完成:
import re
def printAll(dna):
dna = dna.upper()
start = 0
while True:
mtch = re.search("ATG(...)*?(TGA|TAA|TAG)", dna[start:])
if not mtch:
break
print(mtch.group())
start += mtch.start() + 3
printAll(dna3)
并导致另外两次出现:
ATGTAA
ATGAATGACTGA
ATGACTGATAGATATGCTTGTATGCTATGA
ATGCTTGTATGCTATGAAAATGTGAAATGA
ATGCTATGA
ATGAAAATGTGA
ATGTGA