Как добавить «*» внутри уравнения? - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в python. Я хочу сделать калькулятор, и я столкнулся с проблемой прямо сейчас.

Вот упрощенный код, который я пытаюсь сделать:

from math import *
input = "(2)(3)e(sqrt(49))pi" #This is an example of equation
equation = "(2)*(3)*e*(sqrt(49))*pi" #The output

Как я могу добавить "*" между каждым " ) (",") e "," e ("и другие, основанные на уравнении, так что я могу вычислить (уравнение) без необходимости вручную вводить" * ", как в реальной математике?

I Я пытался сделать это, создавая такой код:

from math import *
input = "(2)(3)e(sqrt(49))pi"
input = input.replace(")(", ")*(")
input = input.replace(")e", ")*e")
input = input.replace("e(", "e*(")
input = input.replace(")pi", ")*pi")
#^^^I can loop this using for loop^^^
equation = input
print(eval(equation))

Это определенно работает только в этом уравнении. Я могу l oop метод замены, но это было бы очень неэффективно. Я не хочу иметь 49 итераций, чтобы просто проверить, нужно ли между ними "*" 7 различным символам.

1 Ответ

2 голосов
/ 08 апреля 2020

Проблема, с которой вы столкнетесь здесь, заключается в том, что «e (» следует преобразовать в «e * (», но «sqrt (» следует оставить). Как отмечалось в комментариях, лучшее или «чистое» решение - написать правильное парсер для вашего уравнения. Вы можете поместить «калькуляторный парсер» в вашу любимую поисковую систему для быстрого решения, или, если вы заинтересованы в чрезмерной инженерии, но многому научитесь, вы можете взглянуть на генераторы парсеров, такие как ANTLr.

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

import re

def add_multiplication_symbols(equation: str) -> str:
    constants = ['e', 'pi']
    constants_re = '|'.join(f'(?:{re.escape(c)})' for c in constants)
    equation = re.sub(r'(\))(\(|\w+)', r'\1*\2', equation)
    equation = re.sub(f'({constants_re})' + r'(\()', r'\1*\2', equation)
    return equation

Тогда print(add_multiplication_symbols("(2)(3)e(sqrt(49))pi")) приводит к (2)*(3)*e*(sqrt(49))*pi.

Функция использует модуль re (регулярные выражения) для группировки случаев для всех констант вместе и пытается обойти проблему, описанную выше, путем определения набора постоянных переменных (например, «e» и «pi»). ) от руки.

...