我有一个序列和一个带有多个括号的模式(只有一层深)
seq = "TTVGYDRTERDFSSADFTTVGYDRTERDFSSADFTTVGYDRTERDFSSADFTTVGYDRTERDFSSADF"
pattern = "(TT)V(GYD)"
现在我想匹配模式并获取括号部分的开头和结尾。 所以对于这个例子来说是这样的:
[(0,2), (3,6), (17,19), (20, 23), (34,36), (37,40), (51,53), (54,57)]
我已经玩过重新包装并认为我几乎已经拥有它了
[reo.group(1).start(), reo.group(1).end() for reo in re.finditer( pattern, sequence )]
但遗憾的是 .group(1) 仅返回一个字符串而不是“匹配对象”。有谁知道如何实现这一点?
最佳答案
您可以使用未记录的 MatchObject.regs
为了您的目的。它似乎在 (g0, g1, g2, ..., gn)
元组中定义匹配区域。
import re
seq = "TTVGYDRTERDFSSADFTTVGYDRTERDFSSADFTTVGYDRTERDFSSADFTTVGYDRTERDFSSADF"
pattern = "(TT)V(GYD)"
result = []
for reo in re.finditer(pattern, seq):
result.extend(reo.regs[1:])
结果:
[(0, 2), (3, 6), (17, 19), (20, 23), (34, 36), (37, 40), (51, 53), (54, 57)]
因此第一场比赛的 reo.regs
如下所示:
(Pdb) reo.regs
((0, 6), (0, 2), (3, 6))
因为您只对各个组的跨度感兴趣,所以我们使用 reo.regs[1:]
选择除前两个元组之外的所有元组(从索引 1 到末尾的切片)。
由于 ((0, 2), (3, 6))
仍然是一个元组,因此您最终会得到一个列表 [((s0, e0), (s1, e2)), ((s2, e2), (s3, e3)), ...]
。为了保持指数列表平坦,我因此 extend
一个列表而不是附加到它。
关于python - 使用正则表达式查找括号中多个模式的开头和结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23280266/