所以我要做的是有一个函数,在一个字符串中找到一个序列'ATG',然后从那里沿着字符串以3为单位移动,直到它找到'TAA','TAG',或'TGA'(ATG-xxx-xxx-TAA | TAG | TGA)
为此,我编写了这行代码(其中fdna
是输入序列)
ORF_sequences = re.findall(r'ATG(?:...)*?(?:TAA|TAG|TGA)',fdna)
然后我想添加3个要求:
要执行此部分,我将代码更改为:
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.
如何在不添加重复项的情况下将其拆分(如果两者都发生)并且无序?
答案 0 :(得分:1)
如果可能的[AG]..
应包含在长度要求中,您可以使用:
r'(?x) (?: [AG].. ATG | ATG G.. ) (?:...){7,}? (?:TAA|TAG|TGA)'
或者如果你不想在比赛中加入[AG]..
,你可以使用外观:
r'(?x) ATG (?: (?<=[AG].. ATG) | (?=G) ) (?:...){8,}? (?:TAA|TAG|TGA)'