如何在等式中添加“*”?
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")来解决我上面描述的问题。
我是 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")来解决我上面描述的问题。