Я ищу лучшее регулярное выражение для соответствия линейной системе с 2 неизвестными (ax + by = c) для модуля Python 're'.Где a, b и c - положительные или отрицательные целые числа, и мне нужно разделить совпадение на 3 группы, каждая из которых содержит значения a, b и c (со знаками): группа 1, содержащая значения «a», группа 2, содержащая «b»'значения и группа 3, содержащие значения' с '.
например:
для -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
Я должен поставить 1 перед x или y, если они отрицательны, чтобы заставить его работать:
-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.]]