"""Util for Conversation.""" import re def create_matcher(utterance): """Create a regex that matches the utterance.""" # Split utterance into parts that are type: NORMAL, GROUP or OPTIONAL # Pattern matches (GROUP|OPTIONAL): Change light to [the color] {name} parts = re.split(r'({\w+}|\[[\w\s]+\] *)', utterance) # Pattern to extract name from GROUP part. Matches {name} group_matcher = re.compile(r'{(\w+)}') # Pattern to extract text from OPTIONAL part. Matches [the color] optional_matcher = re.compile(r'\[([\w ]+)\] *') pattern = ['^'] for part in parts: group_match = group_matcher.match(part) optional_match = optional_matcher.match(part) # Normal part if group_match is None and optional_match is None: pattern.append(part) continue # Group part if group_match is not None: pattern.append( r'(?P<{}>[\w ]+?)\s*'.format(group_match.groups()[0])) # Optional part elif optional_match is not None: pattern.append(r'(?:{} *)?'.format(optional_match.groups()[0])) pattern.append('$') return re.compile(''.join(pattern), re.I)