如何在等式中添加“*”?

How to add "*" inside an equation?

我是 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(" 和其他基于方程式之间添加“*”,这样我就可以评估(方程式)而不必输入“*” " 手动操作,就像现实生活中的数学一样?

我已经尝试通过编写这样的代码来做到这一点:

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))

这绝对只适用于这个等式。我可以循环替换方法,但那样效率很低。我不想有 49 次迭代来检查 7 个不同的符号之间是否需要“*”。

您在这里会遇到的问题是 "e(" 应该转换为 "e*(" 但 "sqrt(" 应该保留。正如评论所建议的那样,最好的或 "cleanest" 解决方案是为您的方程编写一个合适的解析器。您可以将 "calculator parser" 放入您最喜欢的搜索引擎以获得快速解决方案,或者如果您对过度工程感兴趣但学到了很多东西,您可以看看解析器生成器,例如 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'*', equation)
    equation = re.sub(f'({constants_re})' + r'(\()', r'*', equation)
    return equation

然后 print(add_multiplication_symbols("(2)(3)e(sqrt(49))pi")) 结果是 (2)*(3)*e*(sqrt(49))*pi

该函数使用 re 模块(正则表达式)将所有常量的大小写组合在一起。它试图通过手动定义一组常量变量(例如 "e" 和 "pi")来解决我上面描述的问题。