打印以x开始以y结束的字符串中的所有匹配项

2024-09-27 23:26:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我很抱歉,如果有人问过这个问题,但我甚至不知道该搜索什么。你知道吗

我刚刚开始学习python,目前正在编写我的第一个程序。其思想是识别一个蛋白质序列中所有打开的阅读框,对于非生物学家来说,这意味着识别一个字符串中所有出现的“M…*”。你知道吗

这是我到目前为止,它几乎工作,但打印重复每n而不是跳到下一个“M…”。你知道吗

# calculates amino acid sequence from nucleotide sequence
protein = nucleotide_seq.transcribe().translate()
print("5'3' Frame 1: \n" + protein)

# Calculates all open reading frames in protein sequence
for n in range(len(protein)):
    met = protein.find("M", n)
    stop = protein.find("*", met)
    orf = protein[met:stop]
    print("Open reading frame starting at residue " + str(met+1) + " : " + orf)
    nextmet = protein.find("M", stop)
    n += nextmet

蛋白质示例:

DIMGYF*GLTGSR*VLSSGWIRAQSCTECG*SSEAGVEVRGVRQTDRHSQPARSAV*SELQILFSFHLLSNCPELAPVAPGLVFRECPESLVSSRPREESPAAQALLTAAESSGTHAPAGGSRRAAAAAKNFPGWEDRRQVAESRSQLLQAFPAS*ASPRR*RPEGGGEPRKRRRTCAQLRSHRLLNLGEREPRLPGAPSP*QRRRGQVVGVRAAKTRRRPATAGSALIRSAGRAAALGSEFACGLRGTAAHEERSVSDRDFSKPGSARESTSKSAGGILINPALPGASW*GGRSGDDSQRVRALLEKLSLSKAPGGAGVPRLPQPCCGPETCARSPN*PHVK*RTVL*LQRWKRPSMTMPSTPRSSRPRADLMATVTPRS*


Tags: in程序序列蛋白质find思想stopprint
3条回答

接收重复的原因是使用for循环并将n增加1,而不是将n移到上一帧的末尾:

# Calculates all open reading frames in protein sequence
n = 0
length = len(protein)
while n < length:
    met = protein.find("M", n)
    stop = protein.find("*", met)
    if stop == -1:  # Stop is beyond boundary of protein
        break
    orf = protein[met:stop]
    print("Open reading frame starting at residue " + str(met+1) + " : " + orf)
    n = stop + 1
import re
protein = "DIMGYF*GLTGSR*VLSSGWIRAQSCTECG*SSEAGVEVRGVRQTDRHSQPARSAV*SELQILFSFHLLSNCPELAPVAPGLVFRECPESLVSSRPREESPAAQALLTAAESSGTHAPAGGSRRAAAAAKNFPGWEDRRQVAESRSQLLQAFPAS*ASPRR*RPEGGGEPRKRRRTCAQLRSHRLLNLGEREPRLPGAPSP*QRRRGQVVGVRAAKTRRRPATAGSALIRSAGRAAALGSEFACGLRGTAAHEERSVSDRDFSKPGSARESTSKSAGGILINPALPGASW*GGRSGDDSQRVRALLEKLSLSKAPGGAGVPRLPQPCCGPETCARSPN*PHVK*RTVL*LQRWKRPSMTMPSTPRSSRPRADLMATVTPRS*"
for match in re.finditer('M([^\*]+)\*', protein):
    print match.start()+1, match.group()



>3 MGYF*
>358 MTMPSTPRSSRPRADLMATVTPRS*

如果M...M..*不是有效的结果,可以将M添加到禁止的字符:M([^\*M]+)\*。你知道吗

>3 MGYF*
>374 MATVTPRS*

n += nextmet不会做您想要的事情,因为当控件返回到for循环的顶部时,n会重置为范围内的下一个数字。因此,您可以使用while循环,而不是使用for循环。例如

maxloop = len(protein)
n = 0
while n < maxloop:
    met = protein.find("M", n)
    if met == -1:
        break
    #etc 
    n = nextmet + 1

我把if语句放在那里,因为如果find找不到它的目标,它将返回-1。你知道吗


这里有一个更完整的演示,现在你给了我们一些数据来处理。你知道吗

protein = '''DIMGYF*GLTGSR*VLSSGWIRAQSCTECG*SSEAGVEVRGVRQTDRHSQPARSAV*
SELQILFSFHLLSNCPELAPVAPGLVFRECPESLVSSRPREESPAAQALLTAAESSGTHAPAGGSRRAAAAA
KNFPGWEDRRQVAESRSQLLQAFPAS*ASPRR*RPEGGGEPRKRRRTCAQLRSHRLLNLGEREPRLPGAPSP
*QRRRGQVVGVRAAKTRRRPATAGSALIRSAGRAAALGSEFACGLRGTAAHEERSVSDRDFSKPGSARESTS
KSAGGILINPALPGASW*GGRSGDDSQRVRALLEKLSLSKAPGGAGVPRLPQPCCGPETCARSPN*PHVK*
RTVL*LQRWKRPSMTMPSTPRSSRPRADLMATVTPRS*'''

#Get rid of newlines
protein = protein.replace('\n', '')

print("5'3' Frame 1:\n{0}\n".format(protein))

maxloop = len(protein)
n = 0
while n < maxloop:
    met = protein.find("M", n)
    if met == -1:
        break

    stop = protein.find("*", met)
    if stop == -1:
        print('Error: no * found for frame starting at residue', met + 1)
        break

    orf = protein[met:stop]
    print("Open reading frame starting at residue", met + 1, ":", orf)

    n = stop + 1

输出

 5'3' Frame 1:
DIMGYF*GLTGSR*VLSSGWIRAQSCTECG*SSEAGVEVRGVRQTDRHSQPARSAV*SELQILFSFHLLSNCPELAPVAPGLVFRECPESLVSSRPREESPAAQALLTAAESSGTHAPAGGSRRAAAAAKNFPGWEDRRQVAESRSQLLQAFPAS*ASPRR*RPEGGGEPRKRRRTCAQLRSHRLLNLGEREPRLPGAPSP*QRRRGQVVGVRAAKTRRRPATAGSALIRSAGRAAALGSEFACGLRGTAAHEERSVSDRDFSKPGSARESTSKSAGGILINPALPGASW*GGRSGDDSQRVRALLEKLSLSKAPGGAGVPRLPQPCCGPETCARSPN*PHVK*RTVL*LQRWKRPSMTMPSTPRSSRPRADLMATVTPRS*

Open reading frame starting at residue 3 : MGYF
Open reading frame starting at residue 358 : MTMPSTPRSSRPRADLMATVTPRS

相关问题 更多 >

    热门问题