这个问题的标题可能不足以描述我要解决的问题,因此希望我的示例能够阐明这一点。我希望Python RegEx是适合这项工作的工具:

首先,我们在寻找以下任一字符串:


卡特彼特
卡特
中央电视台


其次,模式是:



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

最佳答案

您可以使用这种模式:

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)以改善图案。

10-08 12:43