Я создаю язык программирования на Python, и один основной компонент, который мне не хватает для основного языка, - это способность анализировать математические уравнения. У меня есть функция для анализа математики, но мне нужно проверить, является ли вход математическим уравнением. Я ищу регулярное выражение, чтобы соответствовать чему-то вроде 3 * x ^ (4 * y) + 1- (7 * y * z/x).
Вы не можете делать то, что хотите, с помощью регулярных выражений, это не обычный язык. У Python есть расширения, которые вы могли бы злоупотреблять, чтобы делать то, что вы хотите, но оно было бы незащищенным и не принесло бы вам ничего, кроме использования синтаксического анализатора.
То, что вы хотите, это Parser, большая простая в использовании библиотека для Python называется pyparsing.
Вот связанный ответ с примером pyparsing.
Вам нужно использовать фактический синтаксический анализатор. Вот вопрос о разборе выражений в Python:
И вот ссылка от лучшего ответа:
Я ищу регулярное выражение, чтобы соответствовать чему-то вроде
3*x^(4*y)+1-(7*y*z/x)
.
Вы не можете иметь регулярное выражение, которое соответствует строкам, таким как "3 * x ^ (4 * y)...". Языки хорошо сбалансированных круглых скобок просто не являются регулярными.
(На самом деле, говоря о конкретных регулярных выражениях на языке Python, это ложь. Тем не менее, я бы сказал, что регулярные выражения будут неправильным инструментом для этой задачи.)
У меня есть функция для анализа математики...
Если у вас есть синтаксический анализатор, я предлагаю вам просто попытаться разобрать его и сказать true
если он преуспеет, а false
противном случае.
Оказывается, я могу использовать рекурсивную функцию, которая распознает буквы и числа, а затем при разборе выражений, например, "x + y", она проверяет, являются ли "x" и "y" допустимыми математические. Поэтому всякий раз, когда вы проверяете выражение, если оно является буквой или номером, оно действительно, или если оно является оператором с действительными материалами с обеих сторон.
Для разбора математического текста часто используется обратная полировка. Если вы получите свой ввод в этом синтаксисе, вы можете использовать функцию python RPN для ее чтения.
Для синтаксического анализа RPN в питона, либо это или это выглядит многообещающим.
Если вы пишете собственный язык программирования, вы можете просто заставить пользователя использовать это обозначение и проверить, не находится ли он в RPN :)