我有一个序列和一个带有几个括号的模式(只有一个深度)
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)只返回一个字符串而不是“匹配对象”。有谁知道如何实现这一目标?
答案 0 :(得分:2)
您可以将未记录的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
列出一个列表而不是附加到它。