【问题标题】:How to find the operand and the operation in a string如何在字符串中查找操作数和操作
【发布时间】:2012-11-08 06:08:36
【问题描述】:

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

例如:1+2*9/2

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

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

有什么建议吗?

【问题讨论】:

  • 您必须将其解析为抽象语法树 (AST) 才能确定。
  • 我建议你从中缀到后缀的转换开始。然后,您可以使用堆栈和运算符优先级来评估表达式。显然,这不会为您提供类型安全(维度分析),但可以帮助您前进。参考:scriptasylum.com/tutorials/infix_postfix/algorithms/…
  • 谢谢,这似乎有助于我更多地了解操作顺序

标签: python calculator operation operand


【解决方案1】:

如果表达式不像您的示例那么简单,您可以使用RPN - reverse polish notation

如果你的表达式非常简单(只有基本操作和小于 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 上正确拆分行并计算表达式非常容易。

【讨论】:

  • sum(expr.count(op) for op in ops) 是否只计算操作的位置数?
  • s.count(i) - i 在 s 中出现的总数 - 这意味着我们总结出现而不是 indeces
  • 我被教导了一些关于使用 if 语句和将 +1 添加到计数的内容
  • 我以为我回答了你的问题))
【解决方案2】:

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

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

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

【讨论】:

  • ast 模块?你能帮我复习一下吗?我认为我的教授没有提到 ast
  • 我虽然使用 split,但这是我们实际上不允许使用的东西之一,这很遗憾,它会让这变得容易得多
  • 那么你可以使用什么?
  • 嗯,他们希望我们使用函数来尝试显示和计算操作数和操作的数量
  • 是的,但问题是你可以使用什么?
【解决方案3】:
import re
exp = 1+2*9/2
ops = re.findall(r'[\+\-*/]', exp)
print len(ops)

我不知道你为什么要查找操作数的数量 我觉得

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

更好。

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

【讨论】:

  • 操作数的数量让我可以区分它是否只有一个操作数(例如 1 * 5)与更复杂的表达式(1+2*9/2)
  • OK,但是如果你要构建一个计算器,我认为没有必要区分1*5和1+2*9/2。您可以使用自己构建的两个堆栈,或者库 numpy 可以帮助您
  • @Kaifeng Jin:仔细看看你的re!这样就不行了! ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2017-12-05
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多