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

ash*_*njv 4 python regex findall

当我试图回答这个问题时:正则表达式在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'}
Run Code Online (Sandbox Code Playgroud)

这里findall的结果是:

>>> re.findall('(\w+)%\s(\w+)', data)
>>> [('34', 'passed'), ('23', 'failed'), ('46', 'deferred')]
Run Code Online (Sandbox Code Playgroud)

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

[('passed', '34'), ('failed', '23'), ('deferred', '46')]
Run Code Online (Sandbox Code Playgroud)

只是为了澄清,问题是:

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

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

进一步澄清:

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

Dan*_*ski 8

基于对本评论中 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') )
Run Code Online (Sandbox Code Playgroud)