[英]Capturing named groups in regex with re.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'}
這里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對元組中返回的組有一個固定的索引,問題是任何人都知道如何修改這些索引。 這將有助於使組的處理更容易和直觀。
正如您在第二個示例中所確定的那樣, re.findall
以原始順序返回組。
問題是標准的Python dict
類型不以任何方式保留鍵的順序 。 這是Python 2.x的手冊,它使其顯式化,但在Python 3.x中仍然如此: https : //docs.python.org/2/library/stdtypes.html#dict.items
您應該使用的是collections.OrderedDict
:
from collections import OrderedDict as odict
data = """34% passed 23% failed 46% deferred"""
result = odict((key,value) for value, key in re.findall('(\w+)%\s(\w+)', data))
print(result)
>>> OrderedDict([('passed', '34'), ('failed', '23'), ('deferred', '46')])
請注意,您必須使用成對構造函數形式( dict((k,v) for k,v in ...
)而不是dict
理解構造函數( {k:v for k,v in ...}
)。這是因為后者構造了dict
類型的實例,它不能在不丟失鍵的順序的情況下轉換為OrderedDict
...這當然是你想要保留的第一個地方。
根據OP對我的第一個答案的評論 :如果你只是試圖重新排序這樣的2元組列表:
[('34', 'passed'), ('23', 'failed'), ('46', 'deferred')]
......看起來像這樣,個別元素反轉:
[('passed', '34'), ('failed', '23'), ('deferred', '46')]
有一個簡單的解決方案:使用切片語法sequence[::-1]
的列表理解來反轉單個元組元素的順序:
a = [('34', 'passed'), ('23', 'failed'), ('46', 'deferred')]
b = [x[::-1] for x in a]
print b
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.