title: How to evaluate a custom math expression in Python
body: <p>I'm writing a custom dice rolling parser (snicker if you must) in python. Basically, I want to use standard math evaluation but add the 'd' operator:</p>
  
  <pre><code>#xdy
  sum = 0
  for each in range(x):
      sum += randInt(1, y)
  return sum
  </code></pre>
  
  <p>So that, for example, 1d6+2d6+2d6-72+4d100 = (5)+(1+1)+(6+2)-72+(5+39+38+59) = 84</p>
  
  <p>I was using regex to replace all 'd's with the sum and then using eval, but my regex fell apart when dealing with parentheses on either side. Is there a faster way to go about this than implementing my own recursive parsing? Perhaps adding an operator to eval?</p>
  
  <p>Edit: I seem to have given a bad example, as the above example works with my current version. What I'm looking for is some way to evaluate, say, (5+(6d6))d(7-2*(1d4)).<br>
  By "fell apart", I just meant that my current regex expression failed.
  I have been too vague about my failure, sorry for the confusion. Here's my current code:</p>
  
  <pre><code>def evalDice(roll_matchgroup):
      roll_split = roll_matchgroup.group('roll').split('d')
      print roll_split
      roll_list = []
  
      for die in range(int(roll_split[0])):
          roll = random.randint(1,int(roll_split[1]))
          roll_list.append(roll)
  
  def EvalRoll(roll):
      if not roll: return 0
      rollPattern = re.compile('(?P&lt;roll&gt;\d*d\d+)')
      roll_string = rollPattern.sub(evalDice, roll.lower())
  </code></pre>
  
  <p>for this, "1d6+4d100" works just fine, but "(1d6+4)d100" or even "1d6+4d(100)" fails.</p>