区切り文字 '/' で表現するXPath でdict:辞書を参照するものを作りました。
jsonpath-ng · PyPI ではありません。
XPath の書式で配列の何番目かの指定をするインデックス [n] を単独で区切る場合、、
/key/key/[0]
と書くのが正しいのか?
それとも
/key/key[0]
が正しいのか?、わからなくなってしまいましたが、後者を採用することにして、
以下、クラスの staticメソッドとして用意しました。
dicttools.py
# -*- coding: UTF-8 -*- import re class dictXpath(): @staticmethod def get(dct, path): p = path.replace('[', '/[') if re.match(r'^.+\[[0-9]+.+', path) else path return dictXpath._get(dct, p) @classmethod def _get(self, _dct, _path): pl = _path.strip('/').split('/') if re.match(r'^\[[0-9]+\]$', pl[0]): i = int(pl[0].strip('[').strip(']')) if len(_dct) <= i: raise IndexError(pl) return self._get(_dct[i], '/'.join(pl[1:])) if len(pl) > 1 else _dct[i] d = _dct.get(pl[0]) return self._get(d, '/'.join(pl[1:])) if d is not None and len(pl) > 1 else d
これは、無理やり最初にリストの何番目かを示すインデックス [n] が path に
含まれたら区切り文字で区切っています。
使用方法は、予め用意した dict を 以下のように書きます
from dicttools import dictXpath type_scheme = dictXpath.get(foo, "/tokyo/scheme/type") first_group = dictXpath.get(foo, "/tokyo/scheme/group[0]")
jsonpath-ng より、機能は劣っています。