【问题标题】:Python: use regex to solve mathematical expressionPython:使用正则表达式求解数学表达式
【发布时间】:2015-12-08 23:18:04
【问题描述】:

我想知道是否可以使用正则表达式来求解带有实数以及运算符 +、-、*、/ 和 ^ 的简单数学表达式。

例如,输入是一个字符串,如“3.5+4^2”(也可以写成“+3.5+4^2”),输出是 19.5。我的想法是让正则表达式首先将 ^ 识别为首先执行的过程。所以他会取 4^2 并返回 16,所以表达式是 '3.5+16'。然后它会识别 + 并返回 19.5。

另一个输入示例是 -4+5.5*4/2 --> -4+22/2 --> -4+11 --> 7

【问题讨论】:

  • 你可以使用eval函数。 print eval('3.5+4**2') > 19.5
  • 我假设你只是想玩这个。但是表达式不是从常规语法构建的。您需要一个支持上下文无关语法的解析器。例如:stackoverflow.com/questions/559763/…
  • @Valijon eval 是一个糟糕的解决方案,除非你真的知道你在做什么。

标签: python regex python-2.7


【解决方案1】:

正则表达式只是匹配,它们不计算。因此,使用正则表达式来匹配你的字符串是非常好的,类似于

>>> re.match(r'^(?P<n>[0-9]+)(?P<op>[-+\*/])(?P<rest>.+)$', '1+2+3').groupdict()
{'n': '1', 'op': '+', 'rest': '2+3'}

然而,实际计算最好在 Python 本身中执行。

【讨论】:

  • 但是我可以使用正则表达式提取 ^ 前后的实数吗,例如,评估它然后在字符串中替换它,直到我得到一个数字?
  • 当然,使用re.sub。除了替换字符串,您还可以先解析整个表达式树,然后对其求值。
  • 过去一个小时我一直在努力解决这个问题,但并没有真正实现。有没有机会帮帮我?
  • 也许无关紧要,但也许你可以回答.....如果我改变订单,即。 -+ 到 +-,表达式不解析(我正在使用 re.compile btw)。为什么会这样?
  • @0xc0de 如果- 位于字符类的开头或结尾,则它表示文字- 字符。否则,它表示字符的范围,如0-6,它是0123456 的简写。就像这样,[*-/][*+,./-] 的简写。
【解决方案2】:

正则表达式描述字符串的模式,它们不能分析整数/浮点数。除非有一个非常晦涩难懂的 hack 让它工作(我认为这不太可能)。

您可以验证给定字符串是否是有效的数学表达式,但不能使用正则表达式评估数学表达式。

【讨论】:

    【解决方案3】:

    您可以通过 eval 执行此操作
    ^ 可以替换为 ** 以获得正确的公式。

    >>> eval('3.5+4^2'.replace('^', '**'))
    19.5
    >>> eval('-4+5.5*4/2')
    7.0
    

    【讨论】:

    • 使用ast.literal_eval 而不是eval 以避免运行恶意/危险代码。
    【解决方案4】:

    你应该使用一个著名的符号,波兰符号wiki page

    Regex 对您的帮助不大,因为 Regex 使用 graphs 而您想要的计算行的解释将使用 Threes。

    您可能对三个、孩子、叶子、旋转...行为感兴趣。 这很像一个 scool 案例,使用波兰表示法,并且使用三结构,您将使其从左到右顺序读取您的行,而无需正则表达式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多