- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在用 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/
我是一名优秀的程序员,十分优秀!