试图在大字符串中查找子字符串

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