没有内置的方法可以完成这个任务,但可以使用列表推导式来获得期望的结果。
[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
列表)。
对于结果中的每个项目,我们从编译模式的groupindex
字段生成另一个列表推导式构建一个dict
,它看起来像:
>>> pat.groupindex
{'name2': 2, 'name': 1}
针对
groupindex
中的每个项目构建一个列表,如果
findall
中的项目是元组,则使用来自
groupindex
的组编号查找正确的项目,否则该项目将被分配给(唯一存在的)命名组。
[k, i if isinstance(i, str) else i[v-1]]
最后,从字符串列表的列表中构建了一个字典。
请注意,groupindex 仅包含命名组,因此未命名的捕获组将从结果字典中省略。
最终结果为:
[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'}]
findall
。 - beerbajay