Проблема, с которой вы столкнетесь здесь, заключается в том, что «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»). ) от руки.