35 lines
1.2 KiB
Python
35 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(rf"(?P<{group_match.groups()[0]}>[\w ]+?)\s*")
|
|
|
|
# Optional part
|
|
elif optional_match is not None:
|
|
pattern.append(rf"(?:{optional_match.groups()[0]} *)?")
|
|
|
|
pattern.append("$")
|
|
return re.compile("".join(pattern), re.I)
|