Как найти член перехвата в уравнении с помощью регулярных выражений? - PullRequest
1 голос
/ 01 мая 2020

Здесь мой код может получить мне коэффициент x и y, но я не получаю условия перехвата!

eq = ["1x+1y+2", "-1x+12Y-6", "2-5y-3x", "7y-50+2X", "3.14x-1.5y+9", "11.0x-1.5y+9.8"]

def coefficients(equation):
    import re
    coef_x = re.findall('-?[0-9.]*[Xx]', equation)[0][:-1]
    coef_y = re.findall('-?[0-9.]*[Yy]', equation)[0][:-1]
    intercept = re.findall("\b[+-]?\d+[.]?[\d]+\b|[+-]?\d+[+-]|[+-]?\d+[\s]", equation)


    #return float(coef_x), float(coef_y), intercept
    print(coef_x, coef_y, intercept)
    print("")

for i in eq:
    coefficients(i)

Вывод:

1 1 []

-1 12 []

-3 -5 ['2-']

2 7 ['-50+']

3.14 -1.5 []

11.0 -1.5 []

Ожидаемый:

1 1 2

-1 12 -6

-3 -5 2

2 7 -50

3.14 -1.5 9

11.0 -1.5 9.8

Буду очень признателен, если кто-нибудь сможет предложить необходимые изменения, чтобы я мог правильно перехватить

Ответы [ 3 ]

2 голосов
/ 01 мая 2020

Попробуйте с этим:

import re

eq = ["1x+1y+2", "-1x+12Y-6", "2-5y-3x", "7y-50+2X", "3.14x-1.5y+9", "11.0x-1.5y+9.8"]
x = re.compile("([+-]?\d+(\.\d+)?)[xX]")
y = re.compile("([+-]?\d+(\.\d+)?)[yY]")
z = re.compile("([+-]?\d+(\.\d+)?)([+\-]|$)")
for line in eq:
    xx = 0
    m = x.search(line)
    if m:
        xx = m.group(1)
    yy = 0
    m = y.search(line)
    if m:
        yy = m.group(1)
    zz = 0
    m = z.search(line)
    if m:
        zz = m.group(1)
    print("X = "+ xx + ", Y = " + yy + ", intercept= " + zz)
1 голос
/ 01 мая 2020

Фактически вы можете найти коэффициенты с одним регулярным выражением, используя предварительные утверждения, которые не улучшают позицию сканирования механизма регулярных выражений.

(?i)(?=.*?(\-?[\d.]+(?=x)))(?=.*?(\-?[\d.]+(?=y)))(?=.*?(\-?[\d.]+(?=(?:\+|\-|$))))

См. Демонстрационный пример регулярного выражения

Например, чтобы найти перехват:

(?=                   # start of a positive lookahead assertion
     .*?              # match 0 or more characters non-greedily
     (                # start of capture group 3
         \-?          # match optional "-"
         [\d.]+       # match number (not very sophisticated)
         (?=          # start of a new positive lookahead assertion that must be met
             (?:      # start of a non-capture group
                 \+   # match "+"
                 |    # or
                 \-   # match "-"
                 |    # or
                 $   # end of string
             )
         )
     )
)

По сути, мы ищем число, за которым следует либо "+", "-", либо конец строки. Аналогично, чтобы найти коэффициент x, мы ищем число, за которым следует «x»:

(?=                   # start of a positive lookahead assertion
     .*?              # match 0 or more characters non-greedily
     (                # start of capture group 1
        \-?           # match optional "-"
        [\d.]+        # match number (not very sophisticated)
        (?=           # start of a new positive lookahead assertion that must be met
            x         # match "x"
        )
     )
)

Код:

import re

eq = ["1x+1y+2", "-1x+12Y-6", "2-5y-3x", "7y-50+2X", "3.14x-1.5y+9", "11.0x-1.5y+9.8"]

regex = re.compile(r'(?i)(?=.*?(\-?[\d.]+(?=x)))(?=.*?(\-?[\d.]+(?=y)))(?=.*?(\-?[\d.]+(?=(?:\+|\-|$))))')

for ex in eq:
    m = regex.search(ex)
    if m:
        print(m.group(1), m.group(2), m.group(3))

Печать:

1 1 2
-1 12 -6
-3 -5 2
2 7 -50
3.14 -1.5 9
11.0 -1.5 9.8
0 голосов
/ 01 мая 2020

Новое решение той же проблемы.

eq = ["1x+1y+2", "-1x+12Y-6", "2-5y-3x", "7y-50+2X", "3.14x-1.5y+9", "11.0x-1.5y+9.8"]

def coefficients(equation):
    import re
    coef_x = re.findall('-?[0-9.]*[Xx]', equation)[0][:-1]
    coef_y = re.findall('-?[0-9.]*[Yy]', equation)[0][:-1]
    intercept = re.sub("[+-]?\d+[XxYy]|[+-]?\d+\.\d+[XxYy]","", equation)


    return float(coef_x), float(coef_y), float(intercept)


for i in eq:
    print(coefficients(i))

Вывод:

(1.0, 1.0, 2.0)
(-1.0, 12.0, -6.0)
(-3.0, -5.0, 2.0)
(2.0, 7.0, -50.0)
(3.14, -1.5, 9.0)
(11.0, -1.5, 9.8)

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