Фактически вы можете найти коэффициенты с одним регулярным выражением, используя предварительные утверждения, которые не улучшают позицию сканирования механизма регулярных выражений.
(?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