BioPython:如何在Seq对象集合中搜索主题

BioPython:如何在Seq对象集合中搜索主题,python,regex,bioinformatics,biopython,Python,Regex,Bioinformatics,Biopython,我有一个来自BioPython的Seq对象列表,我想在这些序列中搜索一个氨基酸序列基序。搜索这些序列的最佳方法是什么?我的搜索是找到一个类似GxxxG的基序,但它可能更长或更短,但会在第一个G之后的下一个G的第一个实例处停止。使用正则表达式(如G.*G)将给出第一个G的结果,其中包含最后找到的G的任意数量的氨基酸 #Some example code from Bio.Seq import Seq from Bio.Alphabet import IUPAC import re records

我有一个来自BioPython的Seq对象列表,我想在这些序列中搜索一个氨基酸序列基序。搜索这些序列的最佳方法是什么?我的搜索是找到一个类似GxxxG的基序,但它可能更长或更短,但会在第一个G之后的下一个G的第一个实例处停止。使用正则表达式(如G.*G)将给出第一个G的结果,其中包含最后找到的G的任意数量的氨基酸

#Some example code
from Bio.Seq import Seq
from Bio.Alphabet import IUPAC
import re

records = Seq("WALLLLFWLGWLGMLAGAVVIIVR", IUPAC.extended_protein)

search = re.search("F.*G", str(records))
print search.group()
# Want FWLG
# Get 
FWLGWLGMLAG
你想要一个懒惰的对手

A.*B给定的abbbbe可以被视为试图匹配:

ABBBBBBBBBBBBBE
^-------------^
去“那不匹配”少试一个字母

ABBBBBBBBBBBBBE
^------------^
去“匹配”并返回它

惰性匹配
A.*B
将尝试尽可能少地匹配。在这种情况下:

ABBBBBBBBBBBBBE
^^
A和0个字符,然后是B,类似于“这是一个匹配项”,只返回AB

??通常表示可选,但as*是量词(0或更多)?对它采取行动使它懒惰


你想要
F.*G

使用惰性量词是比较慢的方法。要在第一次出现
G
时停止,可以使用否定字符类而不是点。例如:

F[^G]*G
[^G]
表示除
G

然后你可以使用贪婪的量词

要了解速度增益,可以使用以下代码测试不同的模式:

import re
import cProfile

s = r'ACATCATCTATCTATACAATAAAAACTATCCCCTAACTACTACACTACTATCATCACATCATATCACTTTATATCCTAC'
for i in range(1,15):
    s = s + s

s = r'F' + s 
s = s + r'ATCTATCTATACAATAATCTATCTATACAATAATCTATCGATCTATCTATACAATAATCTATCTATACAATATCG' + s

cProfile.run('re.search(r"F[^G]+G",s)')

在你的例子中,如果在A和B之间需要至少有一个字符,该怎么办?因此,输出值至少应为A.B.@Kev,您可以将+用于1或更多。*是0还是更多?是1或0(可选),可以使用{5,}表示5次或更多次,或使用{5,7}表示5到7次。