python-benedict/benedict/core/match.py

23 lines
754 B
Python

# -*- 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