Guest User

Untitled

a guest
Jul 19th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. import re
  2. import pprint
  3.  
  4. class Matcher(object):
  5. def __init__(self):
  6. self.s = ""
  7.  
  8. def match(self, pattern):
  9. s = self.s.lower()
  10.  
  11. alts = lambda seq: "(%s)" % "|".join(seq)
  12. def alts2(groupName, seq):
  13. return "(?P<%s>%s)" % (groupName, "|".join(seq))
  14.  
  15. LIST_OF_NAMES = [
  16. "john",
  17. "alice",
  18. "bob",
  19. ]
  20. LIST_OF_OBJECTS = [ "light", "tv", "oven"]
  21. ON_VERBS = ["turn on", "activate"]
  22. OFF_VERBS = ["turn off", "deactivate"]
  23. ROOMS = ["living room", "bed room"]
  24.  
  25. pattern = pattern.replace("$object", alts2("object", LIST_OF_OBJECTS))
  26. pattern = pattern.replace("$activate", alts2("activate", ON_VERBS))
  27. pattern = pattern.replace("$deactivate", alts2("deactivate", OFF_VERBS))
  28.  
  29. self._match_context = None
  30.  
  31. def f(m):
  32. self._match_context = m.group(1)
  33. #print "got m, m.group: '%s'" % m.group()
  34. #print "got m, m.group(0): '%s'" % m.group(0)
  35. #print "got m, m.group(1): '%s'" % m.group(1)
  36. #print "got m, m.group(2): '%s'" % m.group(2)
  37. return "$" + m.group(2)
  38.  
  39. #print "pattern befor:", pattern
  40. pattern = re.sub("\$(\w+):(\w*)", f, pattern)
  41. #print "pattern after:", pattern
  42.  
  43. pattern = pattern.replace("$location", alts2("location", ROOMS))
  44. pattern = pattern.replace("$name", alts2("name", LIST_OF_NAMES))
  45.  
  46. print "pattern: %s, s: %s" % (pattern, s)
  47. self.m = re.match(pattern, s)
  48. if self.m:
  49. print "%s ->" % s
  50. gd = self.m.groupdict()
  51. if self._match_context:
  52. gd["context"] = self._match_context
  53. pprint.pprint(gd)
  54. print
  55. return gd
  56. else:
  57. return False
  58.  
  59. def parse(self, s):
  60. self.s = s.lower()
  61. #self.match("call $name")
  62. self.match("call $call:name")
  63. self.match("$activate $object")
  64. #self.match("$deactivate $object")
  65. self.match("$activate $object in $near:location")
  66.  
  67. def main():
  68. m = Matcher()
  69. m.parse("Call John")
  70. print "-"*20
  71. m.parse("turn on tv")
  72. #print "-"*20
  73. #m.parse("turn off tv")
  74. print "-"*20
  75. m.parse("turn on tv in living room")
  76. #print "-"*20
  77.  
  78. if __name__ == "__main__":
  79. main()
Add Comment
Please, Sign In to add comment