没有内置的方法可以做到这一点,但可以通过使用列表推导来实现预期的结果。
[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)
... ]
我们使用列表推导式构造一个列表,遍历结果,findall
其中要么是字符串列表,要么是元组列表(0 或 1 个捕获组导致 的列表str
)。
对于结果中的每个项目,我们dict
从另一个列表推导中构造一个,该推导是从groupindex
编译模式的字段生成的,如下所示:
>>> pat.groupindex
{'name2': 2, 'name': 1}
为 中的每个项目构造一个列表groupindex
,如果来自的项目findall
是一个元组,则使用来自的组号groupindex
来查找正确的项目,否则将该项目分配给(仅现存的)命名组。
[k, i if isinstance(i, str) else i[v-1]]
最后,从字符串列表的列表构造一个 dict。
请注意,groupindex
它仅包含命名组,因此结果中将省略未命名的捕获组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'}]