我正在寻找最佳正则表达式,以将线性系统与2个未知数(ax + by = c)匹配,以匹配Python模块“ re”。其中a,b和c是正整数或负整数,我需要在
3个组分别包含a,b和c的值(带符号):第1组包含“ a”值,第2组包含“ b”值,第3组包含“ c”值。
例如。:
对于-3x + y = -2,组1将包含-3,组2将包含1,组3将包含-2
例如。:
x+3y=-4
-2x+y=2
3x-y=2
...
到目前为止,我使用的是:
r"(^[+-]?\d*)x([+-]?\d*)y=([+-]?\d*)"
除了必须处理负号并且a或b缺失时,它几乎可以正常工作。
例如。:
-x+2y=4
5x-y=3
如果它们为负数,我必须在x或y之前放置1,以使其正常工作:
-x+2y=4 => -1x+2=4
5x-y=3 => 5x-1y=3
Python代码:
import numpy as np
import re
def solve(eq1,eq2):
match1 = re.match(r"(^[+-]?\d*)x([+-]?\d*)y=([+-]?\d*)", eq1)
a1, b1, c1 = match1.groups()
if a1 is None or a1== '':
a1=1
elif a1 == '-':
a1=-1
if b1 is None:
b1=1
elif b1 == '-':
b1=-1
elif b1 == '+':
b1 = 1
a1, b1, c1 = float(a1), float(b1), float(c1)
match2 = re.match(r"([+-]?\d*)x([+-]?\d*)y=([+-]?\d*)", eq2)
a2, b2, c2 = match2.groups()
if a2 is None or a2== '':
a2=1
elif a2 == '-':
a2=-1
if b2 is None:
b2=1
elif b2 == '-':
b2=-1
elif b2 == '+':
b2 = 1
a2, b2, c2 = float(a2), float(b2), float(c2)
A = np.array([[a1, b1], [a2, b2]])
B = np.array([[c1], [c2]])
print(np.linalg.inv(A) @ B)
solve("x-y=7","2x+3y=4")
输出:
[[5。] [-2。]]
最佳答案
根据正则表达式x|y=
进行拆分,考虑空字符串以及+
或-
不带数字的情况。
import re
ee = ['x+3y=-4', '-2x+y=2', '3x-y=2', '-x+2y=4', '5x-y=3']
for e in ee:
print([int(m+'1' if m in ['', '+', '-'] else m)
for m in re.split('x|y=', e)])
输出:
[1, 3, -4]
[-2, 1, 2]
[3, -1, 2]
[-1, 2, 4]
[5, -1, 3]
更新#1:
import numpy as np
import re
def solve(eq1, eq2):
coeffs = []
for e in [eq1, eq2]:
for m in re.split('x|y=', e):
coeffs.append(float(m + '1' if m in '+-' else m))
a1, b1, c1, a2, b2, c2 = coeffs
A = np.array([[a1, b1], [a2, b2]])
B = np.array([[c1], [c2]])
return np.linalg.inv(A) @ B
print(solve("x-y=7", "2x+3y=4"))
输出:
[[ 5.]
[-2.]]
使用rextester在线检查。