Python 正则表达式查找从上一个匹配开始的匹配

Python Regex Finding a Match That Starts Inside Previous match

我正在寻找 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, 'ATAT'), (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, 1), match=''>, <re.Match object; span=(3, 3), match=''>, <re.Match object; span=(9, 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, 3, 9]