正则表达式Python findall。使事情变得非常冗余

时间:2013-03-14 04:48:21

标签: python regex sequence redundancy

所以我要做的是有一个函数,在一个字符串中找到一个序列'ATG',然后从那里沿着字符串以3为单位移动,直到它找到'TAA','TAG',或'TGA'(ATG-xxx-xxx-TAA | TAG | TGA)

为此,我编写了这行代码(其中fdna是输入序列)

ORF_sequences = re.findall(r'ATG(?:...)*?(?:TAA|TAG|TGA)',fdna)

然后我想添加3个要求:

  1. 总长度必须为30
  2. 在ATG之前的两个地方必须要检测到A或G(A | G-x-x-A-T-G-x-x-x)
  3. ATG之后的下一个地方必须是G(A-T-G-G-x-x)
  4. 要执行此部分,我将代码更改为:

    ORF_sequence_finder = re.findall(r'[AG]..ATGG..(?:...){7,}?(?:TAA|TAG|TGA)',fdna)
    

    我想要的不是拥有所有这些限制,而是要求1(大于或等于30个字符)然后具有EITHER要求2(A | GxxATGxxx)或要求3(ATGGxx)或两者那些。

    如果我将上面的行分成两行并将它们附加到列表中,它们会出现故障并重复出现。

    以下是不同案例的几个例子:

    sequence1 = 'AGCCATGTGGGGGGGGGGGGGGGGGGGGGGGGGGGGGTGAAAA'
    sequence2 = 'ATCCATGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGTAG'
    sequence3 = 'AGCCATGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGTAG'    
    sequence4 = 'ATGGGGTGA'
    

    sequence1 = 'A**G**CC*ATG*TGGGGGGGGGGGGGGGGGGGGGGGGGGGGG*TGA*AAA'
    

    sequence1将被标准接受,因为它遵循要求2(A | G-x-x-A-T-G-x-x-x)并且其长度> = 30。

    sequence2 = 'ATCC*ATG***G**GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG*TAG*
    

    sequence2将被接受,因为它遵循要求3(A-T-G-G-x-x)并且其长度为> = 30

    sequence3 = 'A**G**CC*ATG***G**GGGGGGGGGGGGGGGGGGGGGGGGGGGGG*TGA*AAA'
    

    sequence3将被接受,因为它同时满足要求2和3,同时还具有> = 30个字符。

    sequence4 = 'ATGGGGTGA'
    

    sequence4不会被接受,因为它不是> = 30,不符合要求2或要求3。

    基本上,我希望它能够接受符合要求2和/或要求3(或两者)的序列,同时满足要求1.

    如何在不添加重复项的情况下将其拆分(如果两者都发生)并且无序?

1 个答案:

答案 0 :(得分:1)

如果可能的[AG]..应包含在长度要求中,您可以使用:

r'(?x) (?: [AG].. ATG | ATG G.. )  (?:...){7,}? (?:TAA|TAG|TGA)'

或者如果你不想在比赛中加入[AG]..,你可以使用外观:

r'(?x) ATG (?: (?<=[AG].. ATG) | (?=G) ) (?:...){8,}? (?:TAA|TAG|TGA)'