微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用re.findall在正则表达式中捕获命名组

当我试图回答这个问题: regex to split %ages and values in python我注意到我必须从findall的结果重新排序组.例如:

data = """34% passed 23% Failed 46% deferred"""
result = {key:value for value,key in re.findall('(\w+)%\s(\w+)',data)}
print(result)
>>> {'Failed': '23','passed': '34','deferred': '46'}

这里findall的结果是:

>>> re.findall('(\w+)%\s(\w+)',data)
>>> [('34','passed'),('23','Failed'),('46','deferred')]

有没有办法更改/指定使re.findall返回的组的顺序:

[('passed','34'),('Failed','23'),('deferred','46')]

只是为了澄清,问题是:

是否可以指定顺序或重新排序组以返回re.findall函数

我使用上面的示例创建了一个字典,以便在您想要更改顺序时提供原因/用例(将键作为值和值作为键)

进一步澄清:

为了处理更大更复杂的正则表达式中的组,您可以命名组,但只有在执行re.search pr re.match时才能访问这些名称.根据我的阅读,findall对元组中返回的组有一个固定的索引,问题是任何人都知道如何修改这些索引.这将有助于使组的处理更容易和直观.

解决方法

基于对 this comment中OP意图的进一步澄清,取3.

Ashwin是正确的,findall不保留命名的捕获组(例如(?P< name> regex)). finditer去救援!它逐个返回各个匹配对象.简单的例子:

data = """34% passed 23% Failed 46% deferred"""
for m in re.finditer('(?P<percentage>\w+)%\s(?P<word>\w+)',data):
    print( m.group('percentage'),m.group('word') )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐