使用常规表达式在括号中查找几个模式的开头和结尾

时间:2014-04-24 21:31:41

标签: python regex

我有一个序列和一个带有几个括号的模式(只有一个深度)

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)只返回一个字符串而不是“匹配对象”。有谁知道如何实现这一目标?

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列出一个列表而不是附加到它。