我有一个即时通讯工具的聊天机器人,我正在尝试为它做一个数学解算器,但是它不能将等式的解决方案发送到Instant Messenger,它会发送等式。
如果有来自Instant Messenger的人发送“解决:2 + 2”,该程序应该发送“4”而不是“2 + 2”。
主要问题:
if (parser.getPayload().lower()[:6]=="solve:"):
parser.sendGroupMessage(parser.getTargetID(), str(parser.getPayload()[7:]))
输出:
it's sending same input again not the answer of equation
测试: 我测试了一些东西,这是正常的。如果我添加此代码,程序将发送等式的解:
if (parser.getPayload().lower()=="test"):
parser.sendGroupMessage(parser.getTargetID(), str(2 + 2 -3 + 8 * 7))
答案 0 :(得分:1)
您的测试代码
str(2 + 2 -3 + 8 * 7)
与您的生产代码不同
str(parser.getPayload()[7:])
扩展为
str("2 + 2 -3 + 8 * 7")
假设您传入相同的等值线。好的是你有管道工作,现在你需要实现像
这样的实际数学解算器str(solve_math(parser.getPayload()[7:]))
def solve_math(expr : str) -> float:
"""
Parses and evaluates math expression `expr` and returns its result.
"""
在这里,您需要首先将表达式字符串解析为表示数据,运算符/函数和评估顺序的结构。所以你的" 2 + 2"表达式变成Addition(Const(2), Const(2))
,而表达式为#34; 2 + 2 * 3"变成像Addition(Const(2), Multiplication(Const(2), Const(3)))
这样的东西然后你需要评估它应该相当简单。
我建议pyparsing
为您提供帮助。
答案 1 :(得分:0)
您需要做什么来以字符串形式评估数学表达式。
但是,如果您只是提供eval
件事,用户输入就会很危险。 Security of Python's eval() on untrusted strings?
您可以使用ast.literal_eval
来降低风险。
或者您可以从以下问题的答案中使用评估者 Evaluating a mathematical expression in a string