正则表达式Python findall。让事情变得不可重复

2024-10-01 22:36:11 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我要做的是让一个函数在字符串中找到一个序列“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-x)
  3. ATG之后的下一个位置必须是G(a-T-G-G-x-x)

为了执行此部分,我将代码更改为:

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

我想要的不是所有这些限制,而是要求1(大于或等于30个字符),然后要求2(A | G-x-x-A-T-G-x-x-x)或要求3(A-T-G-G-x-x)或两者兼而有之。

如果我将上面的行分成两行,并将它们附加到一个列表中,它们就会出现顺序错误并重复出现。

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

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-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将不被接受,因为它的NOT>;=30不符合要求2或要求3。你知道吗

所以基本上,我希望它在满足需求1的同时,接受遵循需求2和/或需求3(或两者)的序列。

我怎样才能在不添加重复项(在两者都出现的情况下)和不乱序的情况下将其拆分?


Tags: 字符串代码retag序列xxxatgorf
1条回答
网友
1楼 · 发布于 2024-10-01 22:36:11

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

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

或者如果不想在匹配中包含[AG]..,可以使用lookarounds:

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

相关问题 更多 >

    热门问题