Python:二次方程的正则表达式

时间:2015-09-11 20:15:58

标签: python regex

我目前正在尝试做二次方程求解器。我在网上搜索了人们如何使用他们的版本,但所有这些都暗示用户输入了系数,尽管这是最简单的方法,但我真的讨厌它。

我希望用户引入整个等式,让程序知道哪些是系数,并计算解。我发现了正则表达式的概念,并自动发现了re模块。

我理解如何实现二次公式来解决问题,但问题是我不知道应该使用哪个函数,以及如何从输入中获取系数。

我希望正则表达式如下:

\d(\sx\s\(\^)\s2/x\^2)(\s\+\s)\dbx(\s\+\s)\d = 0

要查找此系数:

ax^2 + bx + c = 0

我知道正则表达式很糟糕,因为我昨天才开始理解它,所以你也可以告诉我如何改进它。

编辑:

让我们澄清一下我到底想要什么。

  1. 如何改进我上面试过的正则表达式?
  2. 我应该使用什么Python函数,以便我只能使用系数?
  3. 我怎样才能将这些组转换为可用的整数,假设它不存储这些组?

2 个答案:

答案 0 :(得分:4)

假设:系数是数字,变量是x

(-?\d+)x\^2 ([+-]\d+)x ([+-]\d+)

现在,对于-3x^2 +7x -44,您的第一个小组匹配将为-3,第二个小组将为+7,第三个小组将为-44

  • 圆括号(())定义一个组
  • ?表示所遵循的内容可以匹配一次或零次
  • [+-]定义了一次匹配+-的字符集

<小时/> 编辑:开始结束解决方案(请原谅我生锈的python技巧,但我希望你知道如何使用正则表达式):

import re

quadratic_equation_matcher = re.compile(r'(-?\d+)x\^2 ([+-]\d+)x ([+-]\d+)')
quadratic_equation = '-3x^2 +7x -44'
matches = quadratic_equation_matcher.match(quadratic_equation)
a = int(matches.group(1))
b = int(matches.group(2))
c = int(matches.group(3))
d = b**2 - 4*a*b
x1 = (-b + d**0.5)/(2*a)
x2 = (-b - d**0.5)/(2*a)
x1 # => -0.75542709911179939
x2 # => 3.0887604324451328

<小时/> 请注意,您可以使正则表达式更宽松,如下所示:

(-? ?\d+) ?x\^2 ([+-] ?\d+) ?x ([+-] ?\d+)

答案 1 :(得分:0)

我建议首先清理输入a。摆脱所有的空白区域,或至少空间。检查是否有相同的符号,看一边是否有0或另一边。如果有,你可以删除它。如果不是,你必须决定你想要多么聪明。

让它接近你想要处理的格式,换句话说。然后你可以检查他们是否输入了有效的re。

您还需要决定是否可以处理随机条款和x以外字母的顺序。无论你是想要^还是**还是只想要x2。

您可能希望单独获取每个术语(+或 - 之间的所有术语)并确定它是什么类型的术语。

换句话说,在表达之前还有很多事要做。

你顺便见过SymPy