36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""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)
|