Programmer
Programmer

Reputation: 8707

Python dictionary search values for keys using regular expression

I am trying to implement to search for a value in Python dictionary for specific key values (using regular expression as a key).

Example:

I have a Python dictionary which has values like:

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

I need to search for values whose key has 'seller_account'? I wrote a sample program but would like to know if something can be done better. Main reason is I am not sure of regular expression and miss out something (like how do I set re for key starting with '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

Upvotes: 55

Views: 118567

Answers (5)

Ehsan Ahmadi
Ehsan Ahmadi

Reputation: 1498

You can use a combination of "re" and "filter". for example, if you want to search which methods have the word "stat" in their method name in the os module you can use the code below.

import re 
import os
r = re.compile(".*stat.*")
list(filter(r.match, os.__dict__.keys()))

result is:

['stat', 'lstat', 'fstat', 'fstatvfs', 'statvfs', 'stat_result', 'statvfs_result']

I think the performance issue in the original question is the key_value search after the keys have been found with the "re" module. if a portion of the key is interchangeable we can't use "startswith". so "re" is a good choice. plus I use a filter to get a list of all matched keys and make a list of them so we can return all values with simple [DICT[k] for k in LIST].

Upvotes: 7

Clintm
Clintm

Reputation: 4877

like how do I set re for key starting with 'seller_account'

reObj = re.compile('seller_account')

should be:

reObj = re.compile('seller_account.*')

Upvotes: 0

Cédric Julien
Cédric Julien

Reputation: 80751

If you only need to check keys that are starting with "seller_account", you don't need regex, just use 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

or in a one_liner way :

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

NB: for a python 3.X use, replace iteritems() by items() and don't forget to add () for print.

Upvotes: 62

cval
cval

Reputation: 6819

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)]

Upvotes: 8

Andrew Kesterson
Andrew Kesterson

Reputation: 515

You can solve this with dpath.

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

dpath lets you search dictionaries with a glob syntax on the keys, and to filter the values. What you want is trivial:

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

... That will return you a big merged dictionary of all the keys matching that glob. If you just want the paths and values:

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

Upvotes: 11

Related Questions