Python Regex 查找从上一个匹配项开始的匹配项

问题描述

我想在 python 中找到一个字符串中所有子字符串的索引。我当前的正则表达式代码找不到在前一场比赛中开始的比赛。

我有一个字符串:s = r'GATATATGCATATACTT'一个子字符串 t = r'ATAT'。索引 1、3 和 9 处应该有匹配项。使用以下代码显示索引 1 和 9 处的匹配项,因为索引 3 位于第一个匹配项内。如何显示所有匹配项?

非常感谢!

import re

s= 'GATATATGCATATACTT'
t = r'ATAT'

pattern = re.compile(t)

[print(i) for i in pattern.finditer(s)]

解决方法

由于您有重叠的匹配项,您需要在前瞻中使用捕获组作为:(?=(YOUEXPR))

import re

s= 'GATATATGCATATACTT'
t = r'(?=(ATAT))'

pattern = re.compile(t)

[print(i) for i in pattern.finditer(s)]

输出:

<re.Match object; span=(1,1),match=''>
<re.Match object; span=(3,3),match=''>
<re.Match object; span=(9,9),match=''>

或者:

[print(i.start()) for i in pattern.finditer(s)]

输出:

1
3
9

或者:

import re

s= 'GATATATGCATATACTT'
t = 'ATAT'

pattern = re.compile(f'(?=({t}))')

print ([(i.start(),s[i.start():i.start()+len(t)]) for i in pattern.finditer(s)])

输出:

[(1,'ATAT'),(3,(9,'ATAT')]
,

如果您正在寻找位置,最好的选择是re.finditer

import re 

s = r'GATATATGCATATACTT'
t = r'ATAT'

>>> [m for m in re.finditer(rf'(?={t})',s)]
[<re.Match object; span=(1,match=''>,<re.Match object; span=(3,<re.Match object; span=(9,match=''>]

通过返回的match object,可以得到起始索引:

>>> [m.start() for m in re.finditer(rf'(?={t})',s)]
[1,3,9]

你也可以在纯 Python 中找到重叠的子字符串:

def find_overlaps(s,sub):
    start = 0
    while True:
        start = s.find(sub,start)
        if start == -1: return
        yield start
        start += 1

>>> list(find_overlaps(s,t))
[1,9]