python - 使用正则表达式查找括号中多个模式的开头和结尾

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

最佳答案

您可以使用未记录的 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/

相关文章:

python - 合并与函数输出相关的 Pandas 数据帧

regex - 查询页面并使用表格抓取它

javascript - 正则表达式字边界仅用于空白

Javascript 正则表达式.test() : Returning true for a double space (or more) in the string?

python - Boto s3 获取元数据

python - 等效于 Python OpenCv 的 MATLAB imshow(I,[ ]);

python - Tcl 错误 : bad geometry specifier

python - 根据条件使用外键计数注释 Django 查询集

mySQL:包含 | 的选择查询出现问题符号(LIKE 和/或 REGEXP)

c# - 如何从 Regex.Split 中获得正确的结果