dict(辞書)を正規表現で参照する

dict(辞書)の参照、dict[ 正規表現 ] で参照する
場合、dict のサブクラスで以下のようにする。

import re
class rdict(dict):
    def __getitem__(self, key):
        p = re.compile(key)
        r = [ v for k,v in self.items() if p.search(k) ]
        return r if len(r) > 0 else KeyError
    def get(self, k, d=None):
        p = re.compile(k)
        r = [v for k, v in self.items() if p.search(k)]
        if len(r)==1: return r[0]
        return r if len(r) > 1 else d

これは、search() を使ってるので、先頭からマッチせず途中からマッチでも
抽出するようになっている。
match() を使えば先頭文字からマッチである。

実行

dct = {
    'item': 'apple',
    'price': 170,
    'pin': "PIN-08334-2334",
    "pitype": "orange30"
}

rd = rdict(dct)

print(rd['price'])
print(rd['pi.*'])
# [170]
# ['PIN-08334-2334', 'orange30']

print(rd.get('price'))
print(rd.get('pi.*'))
# 170
#  ['PIN-08334-2334', 'orange30']