这个问题的标题可能不足以描述我要解决的问题,因此希望我的示例能够阐明这一点。我希望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)
以改善图案。