我正在从等式中解析数字。从我的代码来看,没有什么问题。 它不能识别等式中的数字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]]
你可以帮我改进正则表达式吗?
答案 0 :(得分:1)
这应该可以正常工作:
pat = re.compile(r"(?:(?<=^)|(?<=[+-]))[a-z]")
此处模式pat
将有助于将所有非数字前置字符替换为1
,例如:
-x+y+z=0
变为-1+1+1=0
,5x+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]