Как преобразовать Latex в выражение Python

#python #database #sympy #equation

#python #База данных #симпатичный #уравнение

Вопрос:

Я нашел библиотеки manu, такие Sympy как python library, которые также находятся в тестировании, но не работают должным образом для синтаксического анализа.

Если у меня есть переменная, которую ABC нужно умножить на 3 , но Sympy представлять ABC как A * B * C

Итак, есть какие-либо идеи о том, какой метод использовать для сохранения уравнения или формулы в базе данных и вычисления во время выполнения с динамически предоставляемым значением переменной?

Ответ №1:

Синтаксический анализ выражений в Python можно выполнить с помощью sympy . Например, sympy позволяет преобразовать ‘-5abc ^ 2’ в expression=-5*a*b*c**2 следующим образом:

 from sympy.parsing.sympy_parser import parse_expr, standard_transformations, implicit_multiplication_application, convert_xor
transformations = (standard_transformations   (implicit_multiplication_application, ))
expression = parse_expr('-5abc^2', transformations=transformations)
  

Возможно, вы захотите обратить процесс вспять (преобразовать выражение в LaTeX script), а затем просто вызвать sympy.latex(expression)

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

ОБНОВЛЕНИЕ: Предположим, ‘abc’ — это одна переменная. Тогда ‘-5abc ^ 2’ означает -5 квадратов abc. Для этого требуется определение пользовательского списка переменных, которые могут быть разделены при использовании split_symbols_custom(...) преобразования. (Я также заменил implicit_multiplication_application на implicit_multiplication )

 from sympy.parsing.sympy_parser import parse_expr, standard_transformations, implicit_multiplication, split_symbols_custom, _token_splittable, convert_xor

def can_split(symbol):
    if symbol not in ('abc',):
        return _token_splittable(symbol)
    return False

transformation = split_symbols_custom(can_split)
transformations = (standard_transformations   (transformation, implicit_multiplication, convert_xor))
expression = parse_expr('-5abc^2', transformations=transformations)
print(expression)
  

So '-5abc^2' анализируется как '-5*abc**2' сейчас. Это можно найти в документации split_symbols_custom

Комментарии:

1. Но в моем случае ABC — это переменная, имеющая значение 5 ABC. = 5 ABC — это одна переменная, а не отдельные символьные переменные

2. После некоторых усилий я прояснил ваше требование. Посмотрите на мой обновленный ответ. На самом деле, вам нужно включить еще одно преобразование в механизм синтаксического анализа, и оно вызывается split_symbols_custom над вашим пользовательским списком.

3. Несмотря на мои уведомления, я обнаружил некоторые ошибки здесь, в моем обновлении. Я попытаюсь еще немного поиграть с этими преобразованиями, чтобы исправить это.

4. Основная проблема заключается в том, что добавление transformation параметра в список (а также его удаление) не имеет никакого эффекта, что противоречит документации : (