我正在寻找最佳正则表达式,以将线性系统与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在线检查。

10-06 00:00
查看更多