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

2024-04-25 23:22:23 发布

您现在位置: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]]

你能帮我改进正则表达式吗?你知道吗


Tags: 代码inre示例fordef数字ee
2条回答

这应该很管用:

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']

相反,假设您寻找已知的常量“xyz=”作为分隔符,并将它们之间的所有内容作为正则表达式组。你知道吗

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。你知道吗

既然你想处理浮点数和电子符号,你需要做一点更多的去除空白,但我将留给你。例如,如果您有公式“0.5x-36E-4y+z=0”,那么在y之前的-和36之间的空格将抛出一个简单的浮点(s)转换。但是如果你把这个空间去掉,你可以这样做:

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

并用[parse_equation(s)中x的default_to_one(x)]获得系数,从而得到您给出的三种情况的输出,再加上一个额外的情况“0.5x-36E-4y+z=0”,以根据您的原始regexp演示如何处理您想要的所有类型。你知道吗

[-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]

相关问题 更多 >