Python RegEx重叠

时间:2017-02-17 19:28:44

标签: python regex

这个问题的标题可能不足以描述我试图解决的问题所以希望我的例子能够解决问题。我希望Python RegEx是适合这项工作的工具:

首先,我们会查找其中任何一个字符串

  • CATGTG
  • CATTTG
  • CACGTG

其次,模式是

  • 字符串
  • 6-7个字母
  • 字符串

实施例

  • 匹配:CATGTGXXXXXXCACGTG
  • 不匹配:CATGTGXXXCACGTG(因为3个字母之间)

第三次,找到匹配项后,从上一场比赛结束开始下一次搜索,包括在内。报告每场比赛的索引。

示例

  • 输入(可读性空间):XXX CATGTG XXXXXX CATTTG XXXXXXX CACGTG XXX

  • 工作流程(可读性空间):

    • 找到匹配:CATGTG XXXXXX CATTTG
    • 从3

    • 开始
    • 在CATTTG中的C处继续搜索

    • 找到匹配项:CATTTG XXXXXXX CACGTG

    • 从15
    • 开始

依旧......

经过几个小时的修补,我的抱歉尝试没有达到我的预期:

regex = re.compile("CATGTG|CATTTG|CACGTG(?=.{6,7})CATGTG|CATTTG|CACGTG")
for m in regex.finditer('ATTCATGTG123456CATTTGCCG'):
   print(m.start(), m.group())

3 CATGTG
15 CATTTG (incorrect)

如果你能用RegEx解决这个问题,你就是天才。谢谢:D

2 个答案:

答案 0 :(得分:2)

您可以使用这种模式:

import re

s='XXXCATGTGXXXXXXCATTTGXXXXXXXCACGTGXXX'

regex = re.compile(r'(?=(((?:CATGTG|CATTTG|CACGTG).{6,7}?)(?:CATGTG|CATTTG|CACGTG)))\2')

for m in regex.finditer(s):
    print(m.start(), m.group(1))

我们的想法是将整个字符串放在前瞻中,并使用反向引用来消耗您不想测试的字符。

第一个捕获组包含整个序列,第二个捕获组包含所有字符,直到下一个起始位置。

请注意,您可以将(?:CATGTG|CATTTG|CACGTG)更改为CA(?:TGTG|TTTG|CGTG)以改善模式。

答案 1 :(得分:0)

主要问题是,为了使用|字符,您需要将替代字符括在括号中。

假设您的示例中只想要第一个匹配字符串,请尝试以下操作:

regex = re.compile("(CATGTG|CATTTG|CACGTG).{6,7}(?:CATGTG|CATTTG|CACGTG)")
for m in regex.finditer('ATTCATGTG123456CATTTGCCG'):
    print(m.start(), m.group(1))

请注意.group(1),它仅匹配第一组括号中的内容,而不是.group()将返回整个匹配。