灵感来自一个现已删除的问题;给定一个带有命名组的正则表达式,是否有一个像findall
这样的方法,它返回一个带有命名捕获组的dict
列表,而不是一个tuple
列表?
给出:
>>> import re
>>> text = "bob sue jon richard harry"
>>> pat = re.compile('(?P<name>[a-z]+)\s+(?P<name2>[a-z]+)')
>>> pat.findall(text)
[('bob', 'sue'), ('jon', 'richard')]
应给予:
[{'name': 'bob', 'name2': 'sue'}, {'name': 'jon', 'name2': 'richard'}]
4条答案
按热度按时间pxyaymoc1#
使用
Pattern.finditer()
,然后使用Match.groupdict()
:57hvy0tb2#
你可以切换到finditer
vtwuwzda3#
如果你使用match:
文档在这里
vmdwslir4#
没有内置的方法来实现这一点,但可以通过使用列表解析来实现预期的结果。
友好的格式:
我们使用列表解析构造一个列表,迭代
findall
的结果,该结果要么是字符串列表,要么是元组列表(0或1个捕获组导致str
的列表)。对于结果中的每一项,我们从另一个列表解析中构造一个
dict
,该列表解析是从编译模式的groupindex
字段生成的,看起来像这样:为
groupindex
中的每个项目构造一个列表,如果来自findall
的项目是一个元组,则使用来自groupindex
的组号来查找正确的项目,否则将该项目分配给(唯一现存的)命名组。最后,从字符串列表的列表构造一个dict。
请注意,
groupindex
只包含命名组,因此生成的dict
将省略未命名的捕获组。结果是: