Я пишу собственный кусочек парсера для кубиков (смех, если нужно) в python. В принципе, я хочу использовать стандартную математическую оценку, но добавить 'D' оператора:Как оценивать пользовательское математическое выражение в Python
#xdy
sum = 0
for each in range(x):
sum += randInt(1, y)
return sum
Так что, к примеру, 1d6 + 2d6 + 2d6-72 + 4d100 = (5) + (1 + 1) (6 + 2) -72+ (5 + 39 + 38 + 59) = 84
Я использовал regex, чтобы заменить все 'd's на сумму, а затем используя eval, но мое регулярное выражение развалилось при работе с круглыми скобками любая сторона. Есть ли более быстрый способ сделать это, чем реализовать собственный рекурсивный синтаксический анализ? Возможно, добавив оператора в eval?
Редактировать: Я, кажется, дал плохой пример, поскольку приведенный выше пример работает с моей текущей версией. То, что я ищу, - это способ оценить, скажем, (5+ (6d6)) d (7-2 * (1d4)).
«Развалился», я просто имел в виду, что мое текущее выражение регулярного выражения не удалось. Я слишком расплывчато о своем провале, извините за путаницу. Вот мой текущий код:
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<roll>\d*d\d+)')
roll_string = rollPattern.sub(evalDice, roll.lower())
для этого, "1d6 + 4d100" работает просто отлично, но "(1d6 + 4) d100" или даже "1d6 + 4d (100)" не удается.
Можете ли вы показать нам, что вы пробовали и как это не удалось? –
Закончилось только выполнение рекурсивной вспомогательной функции. Спасибо за помощь! – taynaron