簡體   English   中英

使用re.findall捕獲正則表達式中的命名組

[英]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對元組中返回的組有一個固定的索引,問題是任何人都知道如何修改這些索引。 這將有助於使組的處理更容易和直觀。

基於對本評論中 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') )

正如您在第二個示例中所確定的那樣, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM