【发布时间】:2013-03-14 04:48:20
【问题描述】:
所以我想做的是有一个函数在字符串中找到一个序列“ATG”,然后从那里以 3 为单位沿着字符串移动,直到找到一个“TAA”、“TAG”、或“TGA”(ATG-xxx-xxx-TAA|TAG|TGA)
为此,我编写了这行代码(fdna 是输入序列)
ORF_sequences = re.findall(r'ATG(?:...)*?(?:TAA|TAG|TGA)',fdna)
然后我想添加 3 个要求:
- 总长度必须为 30
- 在 ATG 之前的两个位置必须检测到 A 或 G (A|G-x-x-A-T-G-x-x-x)
- 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) 并且其长度 >= 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。
所以基本上,我希望它在满足要求 1 的同时接受满足要求 2 和/或要求 3(或两者)的序列。
我怎样才能在不添加重复项(如果两者都发生的情况下)和混乱的情况下将其拆分?
【问题讨论】:
-
我认为您正在寻找 perl。在任何理智的语言中,你真的不想用正则表达式来做这个。
-
应该将
[AG]..计入长度还是只有从ATG开始的字符串必须是>= 30? -
只有 ATG 。 . . TGA|TAA|TAG 应该包含在 30 中。我之前做的是让序列包含 [AG..],然后使用 for 循环稍后对序列 [3:] 进行剪辑,但我无法对仅包含的序列执行此操作[A-T-G-G-xxx]
标签: python regex sequence redundancy