所以我试图弄清楚如何检测数学表达式中操作数和操作的数量
前任:1+2*9/2
我试图使用函数将操作数和操作分离成它们自己的形式,因为我们必须检查必须执行多少操作以及以正确的顺序 (PEDMAS)。
我已经取了方程并取出了所有的空格,现在我必须找到方程中操作数和运算的数量,然后使用 return 来查找用户给定数学表达式的答案。
有小费吗?
所以我试图弄清楚如何检测数学表达式中操作数和操作的数量
前任:1+2*9/2
我试图使用函数将操作数和操作分离成它们自己的形式,因为我们必须检查必须执行多少操作以及以正确的顺序 (PEDMAS)。
我已经取了方程并取出了所有的空格,现在我必须找到方程中操作数和运算的数量,然后使用 return 来查找用户给定数学表达式的答案。
有小费吗?
如果允许,我建议您查看该ast
模块。它旨在使用 Python 自己的解析器为您执行此类操作。
对于实际应用程序,您可能会使用像 Ply 这样的解析器生成器。
对于像这样的简单家庭作业,您可能需要手动编写解析器。首先对其进行标记(str.split
),找到括号,然后使用优先级对其他操作进行分组。
如果表达式不像您的示例那么简单,您可以使用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 上正确拆分行并计算表达式。
import re
exp = 1+2*9/2
ops = re.findall(r'[\+\-*/]', exp)
print len(ops)
我不知道你为什么要找到我认为的操作数的数量
re.findall(r'[0-9]+|[\+\-*/()]', exp)
更好。
所以我认为正则表达式可以帮助你