没有内置方法可以执行此操作,但是可以通过使用列表推导来达到预期的结果。
[dict([[k, i if isinstance(i, str) else i[v-1]] for k,v in pat.groupindex.items()]) for i in pat.findall(text)]
格式友好:
>>> [
... dict([
... [k, i if isinstance(i, str) else i[v-1]]
... for k,v in pat.groupindex.items()
... ])
... for i in pat.findall(text)
... ]
我们使用列表推导构建一个列表,遍历来自groupindex的结果,该结果要么是字符串列表,要么是元组列表(0或1个捕获组会生成dict)。
对于结果中的每一项,我们从另一个列表理解中构造一个groupindex,该列表理解是从已编译模式的dict字段生成的,如下所示:
>>> pat.groupindex
{'name2': 2, 'name': 1}
为groupindex中的每个项目构造一个列表,如果dict中的项目是一个元组,则使用groupindex中的组号来查找正确的项目,否则将该项目分配给(仅现存的)命名组。
[k, i if isinstance(i, str) else i[v-1]]
最后,从字符串列表的列表中构建字典。
请注意,2933302076859409408仅包含命名组,因此在生成的dict中将省略未命名的捕获组。
结果:
[dict([[k, i if isinstance(i, str) else i[v-1]] for k,v in pat.groupindex.items()]) for i in pat.findall(text)]
[{'name2': 'sue', 'name': 'bob'}, {'name2': 'richard', 'name': 'jon'}]