# -*- coding: utf-8 -*- from benedict.core.keypaths import keypaths from benedict.utils import type_util import re def match(d, pattern, separator='.', indexes=True): if type_util.is_regex(pattern): regex = pattern elif type_util.is_string(pattern): # all indexes wildcard support pattern = re.sub(r'([\*]{1})', '(.)*', pattern) # escape square brackets pattern = re.sub(r'(\[([^\[\]]*)\])', '\\[\\g<2>\\]', pattern) regex = re.compile(pattern, flags=re.DOTALL) else: raise ValueError('Expected regex or string, found: {}'.format(type(pattern))) kps = keypaths(d, separator=separator, indexes=indexes) values = [d.get(kp) for kp in kps if regex.match(kp)] return values