Python搜索字符串中的重复运算符

时间:2016-11-17 19:57:31

标签: python regex string search

为了编写计算器,比如python interpeter,我想检查我的表达式的有效性。

我想检查重复数学运算符的字符串,我不想捕捉任何东西,只是为了知道它们是否存在,在这种情况下表达式将是无效的。

4 ++ - + 4有效。

4 * -8无效

4- / 7无效

4 / -4有效,我可能在这里失败了。

minut和plus可以重复,但是 - *例如无效。 就像python interpeter的工作方式一样。 这就是我所拥有的,作为一个正则表达式,但任何更简单的解决方案都是受欢迎的,即使正则表达式也不是很好。

[*/^%\-+][*/^%] | [\-+*/^%][*/^%]

Link

基本上,检查运营商* / ^% - +是否在* / ^%之前或之后(不包括减号和加号)

1 个答案:

答案 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解决方案并且它很漂亮,请告诉我