Регулярное выражение для соответствия линейной системе ax + by = c - PullRequest
0 голосов
/ 01 марта 2019

Я ищу лучшее регулярное выражение для соответствия линейной системе с 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.]]

1 Ответ

0 голосов
/ 01 марта 2019

Разделение на основе регулярного выражения 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...