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