提问人:Programmer 提问时间:5/29/2012 更新时间:12/29/2021 访问量:108876
使用正则表达式搜索键的 Python 字典值
Python dictionary search values for keys using regular expression
问:
我正在尝试实现在 Python 字典中搜索特定键值的值(使用正则表达式作为键)。
例:
我有一个 Python 字典,其值如下:
{'account_0':123445,'seller_account':454545,'seller_account_0':454676, 'seller_account_number':3433343}
我需要搜索键为“seller_account”的值?我写了一个示例程序,但想知道是否可以做得更好。主要原因是我不确定正则表达式并错过了一些东西(例如我如何为以“seller_account”开头的键设置 re):
#!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
答:
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)]
评论
if substr.lower() in key.lower()
如果你只需要检查以 开头的键,则不需要正则表达式,只需使用 startswith()"seller_account"
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")]
注意:对于python 3.X的使用,请替换为并且不要忘记添加。iteritems()
items()
()
print
评论
result
dict()
{...}
[...]
items()
iteritems()
你可以用dpath解决这个问题。
http://github.com/akesterson/dpath-python
dpath 允许您在键上使用 glob 语法搜索字典,并筛选值。你想要的是微不足道的:
$ easy_install dpath
>>> dpath.util.search(MY_DICT, 'seller_account*')
...这将返回一个与该球体匹配的所有键的合并大字典。如果您只想要路径和值:
$ easy_install dpath
>>> for (path, value) in dpath.util.search(MY_DICT, 'seller_account*', yielded=True):
>>> ... # do something with the path and value
评论
您可以使用“re”和“filter”的组合。例如,如果要在 OS 模块中搜索哪些方法的方法名称中包含“stat”一词,则可以使用下面的代码。
import re
import os
r = re.compile(".*stat.*")
list(filter(r.match, os.__dict__.keys()))
结果是:
['stat', 'lstat', 'fstat', 'fstatvfs', 'statvfs', 'stat_result', 'statvfs_result']
我认为原始问题中的性能问题是在使用“re”模块找到键后进行key_value搜索。如果密钥的一部分是可互换的,我们不能使用“startswith”。所以“re”是一个不错的选择。另外,我使用过滤器来获取所有匹配键的列表并列出它们,这样我们就可以用简单的 [DICT[k] for k in LIST 返回所有值。
评论
就像我如何为以“seller_account”开头的键设置 re 一样
reObj = re.compile('seller_account')
应该是:
reObj = re.compile('seller_account.*')
下一个:删除本地开发分支
评论