我正在用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)" 就会失败。