评估字符串“1 + 2 ^ 4 * 4 *(4 + 4 * 9)-10”

时间:2016-02-26 02:29:23

标签: python-2.7 parsing

我正在尝试评估此字符串。 “1 + 2 ^ 4 * 4 *(4 + 4 * 9)-10”

我的策略是获取每个元素,将其放入列表,转换为正确的数据类型(int)或运算符,连接然后评估。我试图避免使用eval()和ast.literal_eval()抛出“格式错误的字符串错误”。我目前停留在需要将运算符从字符串转换为运算符的位置。

这是我到目前为止所做的:

equation = ("1+2^4*4*(4+4*9)-10")

listint1 = 0
listint2 = 1
finallist = []
for elements in equation:
    finallist.append(equation[listint1:listint2])
    listint1 = listint1 + 1
    listint2 = listint2 + 1

finalfinallist = []
for element in finallist:
    if element.isdigit() == True:
        finalfinallist.append(int(element))
    else:
        finalfinallist.append(element)

for element in finalfinallist:
    if element == str:
        if element == "+":
            element = +
        elif element == "^":
            element = ^
        elif element == "*":
            element = *
        elif element == "("
            element = (
        elif element == ")":
            element = )
        elif element == "-"
            element = -


print finalfinallist

思想?

2 个答案:

答案 0 :(得分:2)

您要构建的是解析器。你可以看一下https://en.wikipedia.org/wiki/Comparison_of_parser_generators。解析器用于实现无上下文语法,请参阅https://en.wikipedia.org/wiki/Context-free_grammar

我假设2^4表示取幂,而不是bitwise-xor(根据python运算符)。

尝试解析2^4*4时可能存在歧义,因为它可能是(2 ^ 4)* 4 = 16 * 4 = 64或2^(4*4) = 2^16 = 65536。我不知道ast,但请尝试查看"关联性规则"。

答案 1 :(得分:0)

你可能想要开始构建一个表达式树,就这种事情而言!

Wikipedia: Expression Trees

这样可以使操作符更容易处理,这样您就可以知道何时需要运算符,并且可以进行字符串比较以确定在表达式树中的操作数上使用哪个运算符!

请记住,我从来没有在Python中做到这一点,只在C中。所以,如果有更多的Pythonic方法来做到这一点,我现在还没有意识到,并且愿意听到了。