【发布时间】:2011-02-08 05:12:03
【问题描述】:
我正在用 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)”会失败。
【问题讨论】:
-
你能告诉我们你尝试了什么以及它是如何失败的吗?
-
最后只是创建了一个递归辅助函数。感谢大家的帮助!