0
ORF_sequences = re.findall(r'ATG(?:...){9,}?(?:TAA|TAG|TGA)',sequence)  #thanks to @Martin Pieters and @nneonneo

我有一行代码可以找到 A|G 的任何实例,后跟 2 个字符,然后是 ATG,当以 3 为单位读取时,ATG 后跟 TAA|TAG|TGA。仅在 A|G-xx-ATG 时有效-xxx-TAA|TAG|TGA 为 30 个或更多元素

我想添加一个条件

我需要 ATG 后跟一个 G

所以 A|G-xx-ATG-Gxx-xxx-TAA|TGA|TAG #至少 30 个元素长 示例:GCCATGGGGTTTTTTTTTTTTTTTTTTTTTTTTTGA ^ 可以工作

GCATGAGGTTTTTTTTTTTTTTTTTTTTTTTTTGA
^ would not work because it is an (A|G) followed by only one value (not 2) before the ATG and there is not a G following the A|G-xx-ATG

我希望这是有道理的

我试过

ORF_sequences = re.findall(r'ATGG(?:...){9,}?(?:TAA|TAG|TGA)',sequence)

但它似乎在 ATGG 的最后一个 G 之后使用了窗口大小 3

基本上我需要那个代码,其中第一次出现是 A|G-xx-ATG,第二次出现是 (G-xx)

4

2 回答 2

1

如果您使用 字符组会更容易[AG],无需将两个“免费”字符分组:

 ORF_sequences2 = re.findall(r'[AG]..ATG(?:...)*?(?:TAA|TAG|TGA)',fdna)

或者你需要分组A|G

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

将第一种形式应用于您的示例:

>>> re.findall(r'[AG]..ATG(?:...)*?(?:TAA|TAG|TGA)', 'GCCATGGGGTTTTGA')
['GCCATGGGGTTTTGA']
>>> re.findall(r'[AG]..ATG(?:...)*?(?:TAA|TAG|TGA)', 'GCATGGGGTTTTGA')
[]

在您的尝试中,表达式匹配A, 或表达式,G(?:..)ATG(?:...)*?(?:TAA|TAG|TGA)因为该|符号适用于同一组中之前或之后的所有内容。由于它没有分组,因此它适用于整个表达式:

>>> re.findall(r'A|G(?:..)ATG(?:...)*?(?:TAA|TAG|TGA)', 'A')
['A']
>>> re.findall(r'A|G(?:..)ATG(?:...)*?(?:TAA|TAG|TGA)', 'GCCATGGGGTTTTGA')
['GCCATGGGGTTTTGA']

如果您需要在整个匹配中匹配一定数量的字符,则需要定制这 3 个字符(?:...)组以匹配最少次数:

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

将匹配AG后跟 2 个字符,然后是ATGG另外 2 个字符,然后是至少7 次 3 个字符(总共 21 个),然后是 3 个特定模式(或) TAA,从第一个字符开始总共至少 33 个字符到最后一个字符。额外的组成了 3 之后的模式,并与您评论中的示例相匹配:TAGTGA..ATG

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

以及正确处理您的问题中给出的示例:

>>> re.findall(r'[AG]..ATGG..(?:...){7,}?(?:TAA|TAG|TGA)', 'GCCATGGGGTTTTTTTTTTTTTTTTTTTTTTTTTGA')
['GCCATGGGGTTTTTTTTTTTTTTTTTTTTTTTTTGA']
>>> re.findall(r'[AG]..ATGG..(?:...){7,}?(?:TAA|TAG|TGA)', 'GCATGAGGTTTTTTTTTTTTTTTTTTTTTTTTTGA')
[]
于 2013-03-12T19:34:35.747 回答
1

为确保您获得至少 30 个字符,请使用{n,}量词:

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

这可确保您在 ATG 开头和 TAA|TGA|TAG 终止符之间至少读取 9 个三元组(27 个字符)。

于 2013-03-12T19:48:28.440 回答