解析数学表达式

时间:2015-10-22 13:47:35

标签: python parsing operators python-3.4

以下代码的功能如下:" eqn"转换字符串:" d"这是一个数学表达式,根据反向波兰表示法列入其整数和运算符列表,其中"添加","减去","乘以"并且"划分"分别代表+, - ,*和/。还有"否定"取任何正整数并将其转换为负整数的运算符。示例输入和输出:

  • eqn(" 10 5 add")应该产生[10,5和"添加"]
  • 的输出
  • eqn(" 5 6 add 2 negate divide")应该产生[5,6," add",-2," divide"]

但是使用否定函数,如果没有正确使用(不是在数字之后),那么函数应该返回第一个错误"否定"的索引号。

例如:

  • eqn("否定2加2")应该产生0
  • 的输出
  • eqn(" 2 4添加否定")应该产生3

    的输出
    def eqn(d):
     extrac = []
    
    for e in eqnStr.split():
     if len(e) == 0:
        continue
    
     try:
        extrac.append(int(e))
        continue
     except ValueError:
        pass
    
     try:
        extrac.append(float(e))
        continue
     except ValueError:
        pass
    
    extrac.append(e)
    
    return extrac
    

问题在于否定功能不起作用。不是将整数更改为负数,而是将其作为"否定"在输出中,基本上它应该“消失”。例如:

eqn(" 5 6 add 2 negate divide")应该产生[5,6,"添加", - 2,"除以"]但相反产生[5,6,"添加",2,"否定","划分"]如何解决此问题以及如何让它显示第一个无效否定的索引号?

2 个答案:

答案 0 :(得分:2)

您需要添加一个特殊情况来处理否定。尝试这样的事情:

/usr/bin/R

输出:

def eqn(d):
    extrac = []

    for e in d.split():
        if len(e) == 0:
            continue

        try:
            extrac.append(int(e))
            continue
        except ValueError:
            pass

        try:
            extrac.append(float(e))
            continue
        except ValueError:
            pass

        if e == 'negate':
            if isinstance(extrac[-1], str):
                return len(extrac)
            else:
                extrac[-1] *= -1
                continue

        extrac.append(e)

    return extrac

答案 1 :(得分:1)

这是RPN的错误方法,它应该包括在解析列表时将操作数推入和弹出堆栈。

例如,eqn([1, 2, 3, '+', '*'])会执行(3 + 2) * 1。内置的python'list'类型支持追加(推送)和弹出。

有关RPN的更多信息,请访问:https://en.wikipedia.org/wiki/Reverse_Polish_notation