Python Math Regex

1

Я создаю язык программирования на Python, и один основной компонент, который мне не хватает для основного языка, - это способность анализировать математические уравнения. У меня есть функция для анализа математики, но мне нужно проверить, является ли вход математическим уравнением. Я ищу регулярное выражение, чтобы соответствовать чему-то вроде 3 * x ^ (4 * y) + 1- (7 * y * z/x).

  • 2
    Хотя регулярное выражение может проверять такой ввод, я скептически отношусь к тому, насколько вы можете положиться на него для проверки уравнения.
  • 4
    Нет, регулярное выражение не может даже проверить, правильно ли оно синтаксически.
Показать ещё 2 комментария
Теги:
math
parsing
language-design

5 ответов

10

Вы не можете делать то, что хотите, с помощью регулярных выражений, это не обычный язык. У Python есть расширения, которые вы могли бы злоупотреблять, чтобы делать то, что вы хотите, но оно было бы незащищенным и не принесло бы вам ничего, кроме использования синтаксического анализатора.

То, что вы хотите, это Parser, большая простая в использовании библиотека для Python называется pyparsing.

Вот связанный ответ с примером pyparsing.

  • 0
    +1, хороший ответ :-)
  • 2
    pyparsing - абсолютно правильный инструмент для работы здесь. Синтаксический анализ простых нерегулярных грамматик - это именно та задача, которую отличает pyparsing.
2

Вам нужно использовать фактический синтаксический анализатор. Вот вопрос о разборе выражений в Python:

Оценка выражения математики

И вот ссылка от лучшего ответа:

http://effbot.org/zone/simple-top-down-parsing.htm

  • 0
    У меня есть функция для анализа математики - похоже, у него уже есть синтаксический анализатор ...
  • 0
    Я не уверен. Какая есть функция синтаксического анализа, которая может анализировать выражение, но не сообщает вам, успешно оно или нет? Я не уверен, что он на самом деле имеет.
Показать ещё 1 комментарий
2

Я ищу регулярное выражение, чтобы соответствовать чему-то вроде 3*x^(4*y)+1-(7*y*z/x).

Вы не можете иметь регулярное выражение, которое соответствует строкам, таким как "3 * x ^ (4 * y)...". Языки хорошо сбалансированных круглых скобок просто не являются регулярными.

(На самом деле, говоря о конкретных регулярных выражениях на языке Python, это ложь. Тем не менее, я бы сказал, что регулярные выражения будут неправильным инструментом для этой задачи.)

У меня есть функция для анализа математики...

Если у вас есть синтаксический анализатор, я предлагаю вам просто попытаться разобрать его и сказать true если он преуспеет, а false противном случае.

  • 2
    Хм .. верно. Тем не менее, я не верю, что регулярные выражения - правильный инструмент для этого ... не так ли?
  • 0
    Нет, не совсем.
Показать ещё 1 комментарий
0

Оказывается, я могу использовать рекурсивную функцию, которая распознает буквы и числа, а затем при разборе выражений, например, "x + y", она проверяет, являются ли "x" и "y" допустимыми математические. Поэтому всякий раз, когда вы проверяете выражение, если оно является буквой или номером, оно действительно, или если оно является оператором с действительными материалами с обеих сторон.

0

Для разбора математического текста часто используется обратная полировка. Если вы получите свой ввод в этом синтаксисе, вы можете использовать функцию python RPN для ее чтения.

Для синтаксического анализа RPN в питона, либо это или это выглядит многообещающим.

Если вы пишете собственный язык программирования, вы можете просто заставить пользователя использовать это обозначение и проверить, не находится ли он в RPN :)

  • 1
    Я сам наслаждаюсь RPN, но его пример ясно показывает, что он хочет инфикса. Его пример: 3 * x ^ (4 * y) + 1- (7 * y * z / x)
  • 0
    Я не совсем уверен, как вы намеревались принять этот комментарий.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню