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]
我正在寻找 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]