2

所以我试图弄清楚如何检测数学表达式中操作数和操作的数量

前任:1+2*9/2

我试图使用函数将操作数和操作分离成它们自己的形式,因为我们必须检查必须执行多少操作以及以正确的顺序 (PEDMAS)。

我已经取了方程并取出了所有的空格,现在我必须找到方程中操作数和运算的数量,然后使用 return 来查找用户给定数学表达式的答案。

有小费吗?

4

3 回答 3

1

如果允许,我建议您查看该ast模块。它旨在使用 Python 自己的解析器为您执行此类操作。

对于实际应用程序,您可能会使用像 Ply 这样的解析器生成器。

对于像这样的简单家庭作业,您可能需要手动编写解析器。首先对其进行标记(str.split),找到括号,然后使用优先级对其他操作进行分组。

于 2012-11-08T06:11:04.043 回答
1

如果表达式不像您的示例那么简单,您可以使用RPN - 反向波兰表示法

如果您的表达式非常简单(只有基本操作和小于 10 的值)并且您只需要计数就可以使用这样的东西,我猜:

ops = '+-*/'
operationsCount= sum(expr.count(op) for op in ops)
operandsCount = len(expr) - operationsCount

或者你可以使用这个:

def get_cnt(expr):
    ops = '+-*/'
    res = [expr]
    for op in ops:
        tmp = []
        for x in expr:
            tmp.extend(x.split(op))
        res = tmp[:]        
    return len(res), sum(expr.count(op) for op in ops)

现在您有许多运算符和操作数 - 很容易在 ops/opd 上正确拆分行并计算表达式。

于 2012-11-08T06:14:21.100 回答
1
import re
exp = 1+2*9/2
ops = re.findall(r'[\+\-*/]', exp)
print len(ops)

我不知道你为什么要找到我认为的操作数的数量

re.findall(r'[0-9]+|[\+\-*/()]', exp)

更好。

所以我认为正则表达式可以帮助你

于 2012-11-08T07:04:26.613 回答