Advertisement
Guest User

Untitled

a guest
Apr 26th, 2015
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. import math
  2. import re
  3.  
  4. math_namespace = vars(math).copy()
  5. math_namespace['__builtins__'] = None
  6.  
  7. # regex_function = r'(\d+!|\d+(\.\d+)?\^\d+|\|[+,-]?\d+(\.\d+)?\|)'
  8. # regex_value = r'((([1-9]\d*|0)(\.\d+)?)|'+regex_function+')'
  9. # regex_operation = r'(\+|\-|\*|\/)'
  10. # regex_all = '^[+,-]?('+regex_value+regex_operation+')*'+regex_value+"$"
  11. digit = r"([\-\+]?\d+(\.\d+)?)"
  12. tag = r"(\#[1-9][0-9]?)"
  13. left = r"[\(\|]"
  14. right = r"[\)\|\!]"
  15. operands = r"[\+\-\*\/\^]"
  16.  
  17. value = left+r"*("+digit+r"|"+tag+r")"+right+r"*"
  18. unit = r"("+value+r"|("+operands+value+r"))*"
  19.  
  20. regex_all = r"^"+value+r"("+operands+value+r")*$"
  21. print(regex_all)
  22. valid_pattern = re.compile(regex_all)
  23.  
  24. def evaluate(expression, story):
  25. expression = expression
  26. namespace = math_namespace
  27. try:
  28. if valid_pattern.match(expression):
  29. print("VALID",end=" ")
  30. expression = re.sub(r'('+unit+')!', "factorial("+r'\1'+")", expression)
  31. expression = re.sub(r'(\d+(\.\d+)?)\^(\d+)', "pow("+r'\1'+","+r'\3'+")", expression)
  32. expression = re.sub(r'\|[+,-]?(\d+(\.\d+)?)\|', r'\1', expression)
  33. # substitution for story
  34. if re.findall(r'#([1-9][10-99])', expression):
  35. # print(namespace["story"])
  36. namespace["story"] = [None] + [float(i[1]) if i[1] is not None else i[1] for i in story]
  37. print(namespace["story"])
  38. expression=re.sub(r'#([\d]{1,2})',r'evaluate(story[\1])',expression)
  39. print("INPUT:", expression, end=" => ")
  40. result = eval(expression, namespace)
  41. result = int(result) if int(result) == float(result) else round(float(result),8)
  42. print("RESULT:", result)
  43. return str(result)
  44. return None
  45. except Exception as e:
  46. return None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement