title: Evaluating a mathematical expression without eval() on Python3
body: <p>I'm working on a "copy-paste calculator" that detects any mathematical expressions copied to the system clipboard, evaluates them and copies the answer to the clipboard ready to be pasted. However, while the code uses the eval()-function, I'm not terribly concerned considering the user normally knows what they are copying. That being said, I want to find a better way without giving the calculations a handicap (= eg. removing the ability to calculate multiplications or exponents).</p>
  
  <p>Here's the important parts of my code:</p>
  
  <pre><code>#! python3
  import pyperclip, time
  
  parsedict = {"Ã—": "*",
               "Ã·": "/",
               "^": "**"} # Get rid of anything that cannot be evaluated
  
  def stringparse(string): # Remove whitespace and replace unevaluateable objects
      a = string
      a = a.replace(" ", "")
      for i in a:
          if i in parsedict.keys():
              a = a.replace(i, parsedict[i])
      print(a)
      return a
  
  def calculate(string):
      parsed = stringparse(string)
      ans = eval(parsed) # EVIL!!!
      print(ans)
      pyperclip.copy(str(ans))
  
  def validcheck(string): # Check if the copied item is a math expression
      proof = 0
      for i in mathproof:
          if i in string:
              proof += 1
          elif "http" in string: #TODO: Create a better way of passing non-math copies
              proof = 0
              break
      if proof != 0:
          calculate(string)
  
  def init(): # Ensure previous copies have no effect
      current = pyperclip.paste()
      new = current
      main(current, new)
  
  def main(current, new):
      while True:
          new = pyperclip.paste()
          if new != current:
              validcheck(new)
              current = new
              pass
          else:
              time.sleep(1.0)
              pass
  
  if __name__ == "__main__":
      init()
  </code></pre>
  
  <p><strong>Q: What should I use instead of eval() to calculate the answer?</strong></p>