Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import re
- import pprint
- class Matcher(object):
- def __init__(self):
- self.s = ""
- def match(self, pattern):
- s = self.s.lower()
- alts = lambda seq: "(%s)" % "|".join(seq)
- def alts2(groupName, seq):
- return "(?P<%s>%s)" % (groupName, "|".join(seq))
- LIST_OF_NAMES = [
- "john",
- "alice",
- "bob",
- ]
- LIST_OF_OBJECTS = [ "light", "tv", "oven"]
- ON_VERBS = ["turn on", "activate"]
- OFF_VERBS = ["turn off", "deactivate"]
- ROOMS = ["living room", "bed room"]
- pattern = pattern.replace("$object", alts2("object", LIST_OF_OBJECTS))
- pattern = pattern.replace("$activate", alts2("activate", ON_VERBS))
- pattern = pattern.replace("$deactivate", alts2("deactivate", OFF_VERBS))
- self._match_context = None
- def f(m):
- self._match_context = m.group(1)
- #print "got m, m.group: '%s'" % m.group()
- #print "got m, m.group(0): '%s'" % m.group(0)
- #print "got m, m.group(1): '%s'" % m.group(1)
- #print "got m, m.group(2): '%s'" % m.group(2)
- return "$" + m.group(2)
- #print "pattern befor:", pattern
- pattern = re.sub("\$(\w+):(\w*)", f, pattern)
- #print "pattern after:", pattern
- pattern = pattern.replace("$location", alts2("location", ROOMS))
- pattern = pattern.replace("$name", alts2("name", LIST_OF_NAMES))
- print "pattern: %s, s: %s" % (pattern, s)
- self.m = re.match(pattern, s)
- if self.m:
- print "%s ->" % s
- gd = self.m.groupdict()
- if self._match_context:
- gd["context"] = self._match_context
- pprint.pprint(gd)
- print
- return gd
- else:
- return False
- def parse(self, s):
- self.s = s.lower()
- #self.match("call $name")
- self.match("call $call:name")
- self.match("$activate $object")
- #self.match("$deactivate $object")
- self.match("$activate $object in $near:location")
- def main():
- m = Matcher()
- m.parse("Call John")
- print "-"*20
- m.parse("turn on tv")
- #print "-"*20
- #m.parse("turn off tv")
- print "-"*20
- m.parse("turn on tv in living room")
- #print "-"*20
- if __name__ == "__main__":
- main()
Add Comment
Please, Sign In to add comment