为了编写计算器,比如python interpeter,我想检查我的表达式的有效性。
我想检查重复数学运算符的字符串,我不想捕捉任何东西,只是为了知道它们是否存在,在这种情况下表达式将是无效的。
4 ++ - + 4有效。
4 * -8无效
4- / 7无效
4 / -4有效,我可能在这里失败了。minut和plus可以重复,但是 - *例如无效。 就像python interpeter的工作方式一样。 这就是我所拥有的,作为一个正则表达式,但任何更简单的解决方案都是受欢迎的,即使正则表达式也不是很好。
[*/^%\-+][*/^%] | [\-+*/^%][*/^%]
基本上,检查运营商* / ^% - +是否在* / ^%之前或之后(不包括减号和加号)
答案 0 :(得分:1)
同样,更简洁的解决方案可能是CFG或基于堆栈的中缀表达式方法。然而,你可以破解和试验的东西是以下想法。
构建所有运营商的产品,如下所示:
from itertools import product as p
all=list(p('*/^%-+',repeat=2))
all=map(lambda x:''.join(x),all)
invalids=[..write them by hand in here(hacky part)]
valids=filter(lambda x:x not in invalids,all)
现在你剩下所有长度为2的有效操作。你可以用2的窗口扫描你的字符串,当你发现一对不属于valids的运算符时,你可以声明表达式无效,继续前进。
你可以采用的另一种方式是基于规则的方法。构造一个以运算符作为键的字典,对于每个运算符,该值将是一个包含所有可以跟随它的运算符的列表。
然后你的问题就变成了检查字符i的字符串,其有效性条件为
string[i+1] in dictionary[string[i]]
如果您确实找到了CFG解决方案并且它很漂亮,请告诉我