-1

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

我有一个 string:s = r'GATATATGCATATACTT'和一个 substring 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)]
4

2 回答 2

0

由于您有重叠匹配,因此您需要在前瞻中使用捕获组:(?=(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')]
于 2021-01-16T16:32:57.577 回答
0

如果您正在寻找位置,最好的选择是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=''>]

使用返回的匹配对象,您可以获得起始索引:

>>> [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]
于 2021-01-16T16:37:16.660 回答