【问题标题】:How to add additional criteria to re.findall ... Python 2.7?如何向 re.findall ... Python 2.7 添加其他条件?
【发布时间】:2013-03-12 19:31:00
【问题描述】:
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 个元素长 例子: GCCATGGGGTTTTTTTTTTTTTTTTTTTTTTTTGA ^ 会工作

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)

【问题讨论】:

  • 对不起,我以为我不久前批准了其中一个答案

标签: python regex findall


【解决方案1】:

如果使用[AG]的字符组会更容易,不需要将两个'free'字符分组:

 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 个以上的模式(TAATAGTGA),从第一个字符到最后一个字符总共至少 33 个字符。额外的..ATG 之后构成了3 的模式,并与您评论中的示例相匹配:

>>> 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')
[]

【讨论】:

  • 谢谢!我现在了解 [AG] 和 A|G 之间的区别。很抱歉,我忘记在我现在将更新的功能中添加另一个功能。在第一个 ATG 之后必须有一个 G 但如果我尝试 re.findall(r'[AG]..ATGG(?:...){9,}?(?:TAA|TAG|TGA)','GCCATGGGGTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGA ') 它不起作用,因为它在最后一个 G 之后使用窗口大小 3 。我会在上面的问题中更好地解释它
  • 那你就可以ATGG..(?:...){8,}了。
【解决方案2】:

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

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

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

【讨论】:

  • 好主意!我不知道你能做到这一点
猜你喜欢
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多