gpt4 book ai didi

python - 如何在 Python 中评估自定义数学表达式

转载 作者:太空狗 更新时间:2023-10-29 22:12:02 25 4
gpt4 key购买 nike

我正在用 Python 编写一个自定义的骰子滚动解析器(如果必须的话,请窃笑)。基本上,我想使用标准数学评估但添加“d”运算符:

#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

我使用正则表达式将所有“d”替换为总和,然后使用 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)”都失败了。

最佳答案

你可以使用 callback function使用 re.sub。当您点击链接时,向下搜索以“If repl is a function...”开头的段落

import re
import random

def xdy(matchobj):
x,y=map(int,matchobj.groups())
s = 0
for each in range(x):
s += random.randint(1, y)
return str(s)
s='1d6+2d6+2d6-72+4d100'
t=re.sub('(\d+)d(\d+)',xdy,s)
print(t)
# 5+10+8-72+197
print(eval(t))
# 148

关于python - 如何在 Python 中评估自定义数学表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642650/

25 4 0
文章推荐: python - 谷歌应用引擎( python ): TemplateSyntaxError: 'for' statements with five words should end in 'reversed'
文章推荐: c# - 用集合EntityFramework连接表
文章推荐: c# - 在 ASP.NET C# SQL 中导致问题的文本框
文章推荐: python - ProgrammingError : (1146, "Table ' test_.' doesn' t exist") 为 Django 运行单元测试时