0

我有一个来自 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
4

2 回答 2

2

你想要一个懒惰的比赛。

A.*B 给定 ABBBBBBBBBBBBBE 可以认为是试图匹配:

ABBBBBBBBBBBBBE
^-------------^

去“不匹配”并少试一个字母

ABBBBBBBBBBBBBE
^------------^

去“匹配”并返回它

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

ABBBBBBBBBBBBBE
^^

A 和 0 个字符,然后是 B,就像“这是一场比赛”,只返回 AB

? 通常表示可选,但因为 * 是量词(0 或更多)?作用于它使其变得懒惰。

你要F.*?G

于 2013-10-23T22:52:08.483 回答
0

使用惰性量词是较慢的方法。要在第一次出现时停止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)')
于 2013-10-24T00:07:01.837 回答