【问题标题】:Regex Python findall. Making things nonredundant正则表达式 Python findall。使事情变得非冗余
【发布时间】: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 个要求:

  1. 总长度必须为 30
  2. 在 ATG 之前的两个位置必须检测到 A 或 G (A|G-x-x-A-T-G-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) 并且其长度 >= 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


【解决方案1】:

如果可能的[AG].. 应该包含在您可以使用的长度要求中:

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

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

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

【讨论】:

  • 非常感谢。你知道我可以去哪里了解更多关于这行代码到底发生了什么吗?这适用于我尝试过的所有内容,但有些语法对我来说是陌生的,我希望能够理解它,以便稍后解决问题
  • @draconisthe0ry:向下滚动查看它们的解释:regex101.com/r/bR9sK1regex101.com/r/uC2lJ7 有关构造的更多详细信息,请查看您的正则表达式参考,例如 perlre
  • 如果您要在长度之外创建一个变量(即 7 位置)。 . .你会怎么做?我在这里展示了我的尝试stackoverflow.com/questions/22673739/…
猜你喜欢
  • 2021-05-22
  • 2015-08-13
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多