2012-05-29 108 views
21

我想實現在Python字典中搜索特定鍵值(使用正則表達式作爲鍵)的值。使用正則表達式的鍵的Python字典搜索值

例子:

我有像有值的Python字典:

{'account_0':123445,'seller_account':454545,'seller_account_0':454676, 'seller_account_number':3433343} 

我需要尋找價值,其關鍵有 'seller_account'?我寫了一個示例程序,但想知道是否可以做得更好。最主要的原因是我不知道的正則表達式,並錯過了一些東西(像我怎麼設置再重點以「seller_account」):

#!usr/bin/python 
import re 
my_dict={'account_0':123445,'seller_account':454545,'seller_account_0':454676, 'seller_account_number':3433343} 

reObj = re.compile('seller_account') 

for key in my_dict.keys(): 
     if(reObj.match(key)): 
       print key, my_dict[key] 

~ home> python regular.py 

seller_account_number 3433343 
seller_account_0 454676 
seller_account 454545 
+0

如果您必須經常搜索這些鍵的這些部分,那麼您的數據結構可能有問題。 – eumiro

回答

29

如果你只需要檢查開始鍵與"seller_account",你不需要正則表達式,只需使用startswith()

my_dict={'account_0':123445,'seller_account':454545,'seller_account_0':454676, 'seller_account_number':3433343} 

for key, value in my_dict.iteritems(): # iter on both keys and values 
     if key.startswith('seller_account'): 
       print key, value 

或在指定one_liner方式:

result = [(key, value) for key, value in my_dict.iteritems() if key.startswith("seller_account")] 
+1

使'result'成爲一個字典,你可以使用'dict()'或(在Python 2.7中)'{...}'而不是列表理解'[...]'。 –

8
def search(dictionary, substr): 
    result = [] 
    for key in dictionary: 
     if substr in key: 
      result.append((key, dictionary[key])) 
    return result 

>>> my_dict={'account_0':123445,'seller_account':454545,'seller_account_0':454676, 'seller_account_number':3433343} 
>>> search(my_dict, 'seller_account') 
[('seller_account_number', 3433343), ('seller_account_0', 454676), ('seller_account', 454545)] 
+1

您可以通過將搜索詞和鍵轉換爲小寫字母來區分大小寫,從而使搜索更通用一些:'if key.lower()中的substr.lower()' – psychemedia

6

你可以用dpath解決這個問題。

http://github.com/akesterson/dpath-python

dpath讓您搜索詞典與密鑰的水珠語法,並篩選值。你想要的是微不足道的:

$ easy_install dpath 
>>> dpath.util.search(MY_DICT, 'seller_account*') 

...這將返回一個與該glob匹配的所有鍵的大合併字典。如果您只想要路徑和值:

$ easy_install dpath 
>>> for (path, value) in dpath.util.search(MY_DICT, 'seller_account*', yielded=True): 
>>> ... # do something with the path and value 
+0

安德魯,我會小心張貼不披露。 **你所有的答案都是* dpath *。你顯然很喜歡(或部分)dpath;如果你是,我想提醒你必須公開你的聯盟。 – Jesse

+6

從github網址判斷,Andrew似乎是dpath的主要作者。鑑於它是麻省理工學院許可的軟件,我沒有看到任何問題。 – dalloliogm