在一个lin中按顺序获取命名组的跨距

2024-09-25 16:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的正则表达式r'(?P<mark1>)|\s+(?P<mark2>)|(?P<mark3>)\s+'(示例正则表达式不是实际的),我希望按顺序获得所捕获的组在匹配中的跨距。在

例如:
1[match.span() for match in re.finditer(regex, string)]按顺序返回跨度,但给出整个匹配的范围,而不仅仅是捕获的组。
2[match.span('mark1') for match in re.finditer(regex, string)]按捕获组的顺序返回跨距,但将(-1, -1)放入其他命名组。在

那么,我可以像上面的查询一样简单地按照匹配的顺序在一行中获得命名组的跨距吗?在

我找到了以下方法:
[match.span(name) for match in re.finditer(regex, string) for name, value in match.groupdict().items() if value is not None]

有简单的吗?在

举个例子来展示我的场景:

import re
s = "asfasdf      32392  ..///?%        aslf    /././/               342"
reg = r'(?P<mark1>[a-z]+)|\s+(?P<mark2>[0-9]+)|(?P<mark3>[./?%]+)\s+'
print([match.span(name) for match in re.finditer(reg, s) for name, value in match.groupdict().items() if value is not None])
print([match.span() for match in re.finditer(reg, s)])
print
print([match.span('mark1') for match in re.finditer(reg, s)])
print([match.span('mark2') for match in re.finditer(reg, s)])
print([match.span('mark3') for match in re.finditer(reg, s)])

输出:

^{pr2}$

Tags: nameinrefor顺序valuematchreg