【问题标题】:BioPython: How to search for a motif in a collection of Seq objectsBioPython:如何在 Seq 对象集合中搜索主题
【发布时间】:2013-10-23 22:40:56
【问题描述】:

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

【问题讨论】:

    标签: python regex bioinformatics biopython


    【解决方案1】:

    你想要一个惰性匹配。

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

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

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

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

    去“匹配”并返回它

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

    ABBBBBBBBBBBBBE
    ^^
    

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

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

    你想要F.*?G

    【讨论】:

    • 如果在您的示例中,A 和 B 之间需要至少有一个字符怎么办?所以输出至少要 A.B.
    • @Kev 您可以使用 + 表示 1 或更多。 * 为 0 或更多,?为 1 或 0(可选),您可以使用 {5,} 表示 5 次或更多次,或使用 {5,7} 表示 5 到 7 次。
    【解决方案2】:

    使用惰性量词是较慢的方法。要在第一次出现 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)')
    

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      相关资源
      最近更新 更多