从x,y,z方程解析数字

时间:2016-10-14 18:55:30

标签: python

我正在从等式中解析数字。从我的代码来看,没有什么问题。 它不能识别等式中的数字1,因为通常在等式中,跳过数字1。

def equationSystem(e):
a = []
for s in e:
    a.append(re.findall("[-]?\d+[\.]?\d*[eE]?[-+]?\d*", s))

print a[0]

示例

equation =  ["-x+y+z=0", "x-3y-2z=5", "5x+y+4z=3"]

预期产出

[[-1, 1, 1, 0], [1, -1, -2, 5], [5, 1, 4, 3]]

但实际输出是

[[0], [-2, 5], [5,1,4,3]]
你可以帮我改进正则表达式吗?

2 个答案:

答案 0 :(得分:1)

这应该可以正常工作:

pat = re.compile(r"(?:(?<=^)|(?<=[+-]))[a-z]")

此处模式pat将有助于将所有非数字前置字符替换为1,例如:
-x+y+z=0变为-1+1+1=05x+y+4z=3变为5x+1+4z=3

for x in equation:
  s = re.sub(pat, "1", x) # substitute by "1"
  print (re.findall(r"[-]?\d", s)) # find digits (with signs)

这给出了:

['-1', '1', '1', '0']
['1', '-3', '-2', '5']
['5', '1', '4', '3']

答案 1 :(得分:1)

假设您正在寻找已知的常数&#34; xyz =&#34;作为分隔符,并将它们之间的所有内容作为正则表达式组。

import re

pattern_string = '([^x]*)x([^y]*)y([^z]*)z=(.+)'
pattern = re.compile(pattern_string)

def parse_equation(s):
    results = pattern.search(s)
    return results.groups()

samples =  ["-x+y+z=0", "x-3y-2z=5", "5x+y+4z=3"]
for s in samples:
    print parse_equation(s)

输出

('-', '+', '+', '0')
('', '-3', '-2', '5')
('5', '+', '+4', '3')

然后你只需要担心将这些字符串转换为数字。对于前三个,您知道它们不能为零,因此它们可能具有不同的转换功能,但这不是必需的。重要的是,如果你在字符串中找不到任何数字,那么你将返回+/- 1。

由于你想要处理浮点数和电子符号,你需要做更多的事情来去掉空格,但我会把它留给你。例如,如果你有等式&#34; 0.5x - 36E-4y + z = 0&#34;然后在y之前的 - 和36之间的空间将抛弃简单的浮动转换。但如果你拿出那个空间,你可以这样做:

def default_to_one(s):
    try:
        coefficient = float(s)
        return coefficient
    except:
        if -1 != s.find('-'):
            return -1
        else:
            return 1

并使用[default_to_one(x)for the parse_equation(s)]得到系数,得到你输出的三种情况的输出,加上一个额外的情况&#34; 0.5x -36E-4y + z = 0&#34;根据您的原始正则表达式演示处理您想要的所有类型。

[-1, 1, 1, 0.0]
[1, -3.0, -2.0, 5.0]
[5.0, 1, 4.0, 3.0]
[0.5, -0.0036, 1, 0.0]