问题描述
我想在 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]