коротковатой версияRegex для разбора плохо отформатированных полиномов
Я использую это регулярное выражение:
(^|[yY]\s{0,}\=|\+|\-)\s{0,}([0-9]{0,}\.?[0-9]{0,})\s{0,}(\*{0,1}[xX]{0,1})\s{0,}(\^{0,1})(-?)([0-9]{0,}\.?[0-9]{0,})(\s{0,}|$)?
Чтобы попытаться извлечь все коэффициент и порядка число элементов из уравнений, как это:
y=x+3.3X^-50+ 15x25.5 - 4x^+2x^2 +3*x-2.5+1.1
Я хочу, чтобы регулярное выражение игнорировало ошибочный 4x^
, который не имеет своего номера мощности (в настоящее время это не делает) и позвольте мне довести этот окончательный результат:
((1.0, 1.0), (3.3, -50.0), (15.0, 25.5), (2.0, 2.0), (3.0, -3.5), (1.1, 0.0))
Где первая координата - коэффициент, а второй - порядок для каждого элемента. В настоящее время регулярное выражение выше «почти» работает, если я беру группы 1 & 2 и 5 & 6, чтобы дать мне коэффициент и порядок соответственно.
Он просто падает на ошибочный 4x^
плюс чувствует себя чрезвычайно неэлегантным, но я немного нул в регулярном выражении и не знаю, какие улучшения сделать.
Как улучшить это регулярное выражение, а также исправить так, что 4x^
считается «неправильным», но 4x2
и 4x^2
оба хороши?
Т.Л., др версия
Я пытаюсь синтаксического анализа полиномиальных уравнений, введенные пользователем для того, чтобы подтвердить, а затем разложить уравнение в ряд элементов. Уравнения будут представлены как строки.
Вот пример того, как пользователи просят форматировать их строку:
y = 2.0x^2.5 - 3.1x + 5.2
Где x
является независимой переменной (не символ раза) и y
является зависимой переменной.
В действительности пользователи обычно делают любой из следующих ошибок:
- Забыв включить
y =
- Добавление
*
к коэффициентам, таких какy = 2.0*x
- Использование целых чисел вместо поплавков, например
y = 5x
- Отсутствует
^
при настройке порядка, например.y = x3
- Добавление или удаление пробелов в любом месте
Однако для всех из них, я бы сказал, что это все-таки легко понять, что пользователь пытается писать. Под этим я подразумеваю, что очевидно, что коэффициент и порядок предназначены для каждого элемента.
Так что я хочу написать некоторое регулярное выражение, которое правильно разделяет введенную строку на отдельные элементы и может получить мне A
(коэффициент) и B
(порядок) каждого элемента, где элемент вообще имеет форму Ax^B
и A
и B
могут быть любыми действительными числами.
я придумал следующий пример:
y=x+3.3X^-50+ 15x25.5 - 4x^+2x^2 +3*x-2.5+1.1
Что я считаю, охватывает все возможные вопросы, которые я, изложенных выше, в дополнении к одной другой прямой вверх ошибке 4x^+2x^2
отсутствуют порядок на элементе 4x^
.
Для этого примера я бы хотел: ((1.0, 1.0), (3.3, -50.0), (15.0, 25.5), (2.0, 2.0), (3.0, -3.5), (1.1, 0.0))
, где 4x^
был проигнорирован.
Я несколько новых для Regex, но я сделал попытку с помощью regex101.com создать следующее:
(^|[yY]\s{0,}\=|\+|\-)\s{0,}([0-9]{0,}\.?[0-9]{0,})\s{0,}(\*{0,1}[xX]{0,1})\s{0,}(\^{0,1})(-?)([0-9]{0,}\.?[0-9]{0,})(\s{0,}|$)?
Это кажется почти работу со следующими вопросами:
- Значит ли не улавливать недостающий порядок, как пример
4x^
, приведенный выше - я не уверен, как сделать необязательность номера заказа «условным» на наличие^
, а также работает, когда^
нет, но номер заказа такой, какy = 4x2
- ощущению очень в-лаконичным/безвкусный, но неопытности я изо всех сил, чтобы увидеть, где можно улучшить
Также обратите внимание, я с удовольствием, игнорируя вопрос о повторяющихся элементов с того же порядка, не суммируются , например Я с удовольствием игнорирую y = x^2 + x^2
не отображается как y = 2x^2
.
Благодарим за помощь.
p.s. Программа должна быть написана в Go, но я тоже немного нуб в Go, поэтому я первый прототип в Python. Не уверен, что это будет иметь какое-то значение для регулярного выражения (я действительно новичок в регулярном выражении).
Я просто хочу отметить, что '{0,}' может быть '*' и '{0,1}' is '?'. – Uriel
Я думаю, что ответ, который вы пытаетесь получить, это ((1.0, 1.0), (3.3, -50.0), (15.0, 25.5), (2.0, 2.0), (3.0, -2.5), (1.1, 0.0)) ... обратите внимание, что пятая пара (3.0, -2.5) вместо (3.0, -3.5). Правильно? –