Python正则表达式重叠

Python正则表达式重叠,python,regex,Python,Regex,这个问题的标题可能不足以描述我试图解决的问题,所以希望我的例子能说明问题的要点。我希望Python正则表达式是适合这项工作的工具: 首先,我们要查找这些字符串中的任何一个: CATGTG 卡特格 CACGTG 其次,模式是: 串 6-7封信 串 范例 匹配:CATGTGXXXXXCACGTG 不匹配:CATGTGXXXCACGTG(因为三个字母之间) 第三个,当找到匹配项时,从上一个匹配项的末尾开始下一次搜索,包括上一个匹配项。报告每个匹配的索引 示例: 输入(可读性空格):XXX

这个问题的标题可能不足以描述我试图解决的问题,所以希望我的例子能说明问题的要点。我希望Python正则表达式是适合这项工作的工具:

首先,我们要查找这些字符串中的任何一个:

  • CATGTG
  • 卡特格
  • CACGTG
其次,模式是:

  • 6-7封信
范例

  • 匹配:CATGTGXXXXXCACGTG
  • 不匹配:CATGTGXXXCACGTG(因为三个字母之间)
第三个,当找到匹配项时,从上一个匹配项的末尾开始下一次搜索,包括上一个匹配项。报告每个匹配的索引

示例

  • 输入(可读性空格):XXX CATGTG XXXXXX CATTG XXXXXXX CACGTG XXX

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

    • 找到匹配项:CATGTG XXXXXX CATTG
    • 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)

如果你能用正则表达式解决这个问题,你就是个天才。谢谢:D

您可以使用这种模式:

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))
其思想是将整个字符串放在lookahead中,并使用backreference来使用您不想测试的字符

第一个捕获组包含整个序列,第二个捕获组包含下一个开始位置之前的所有字符


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

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

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

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()
将返回整个匹配项。

您可以发布您尝试的内容和所需的输出吗?您是否希望测试字符串等的回答为是/否@WiktorStribiżew:no,使用
finditer
我只是添加了它。