为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用正则表达式从字符串 验证数学表达式

如何使用正则表达式从字符串 验证数学表达式

小唯快跑啊 2022-08-25 14:00:37
我试图使用python中的eval方法来评估写在字符串中的基本数学运算,但我首先检查字符串以确保没有任何问题发生,这样我就可以正确地使用eval()来评估我的字符串。以下是我现在的一些代码:import res = ("6   + 2 ^ 2")if re.findall('\d+? *?\+ *?\d+?', s):    print(eval(s))else:    print ("Try entering a math problem")输出是10,如我所愿。但是当我将变量s切换为等于时,我收到一条错误消息"6   + (2 ^  2)"“尝试输入数学题”相反。它仍然应该是10,但由于某种原因,我没有得到它。由于某种原因,括号搞砸了一切。我在正则表达式中做错了什么?
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

准确地写出您在正则表达式中断言的内容很有用。在这种情况下,它是:


import re


pat = re.compile('''

\d+?                # one or more digits, taking as few as possible to match

 *?                 # zero or more literal spaces, taking as few as possible to match

\+                  # a literal plus sign

 *?                 # zero or more literal spaces, as before

\d+?                # one or more digits, as before

''', re.X)

不出所料,您不会在任何地方处理括号。你可以改用:


import re

pat = re.compile('''

\d+?                # one or more digits, taking as few as possible to match

\s?                 # one or zero space characters

\+                  # a literal plus sign

\s?                 # one or zero space characters

\(?                 # one or zero literal open parentheses

\s?                 # one or zero space characters

\d+?                # one or more digits, as before

''', re.X)

但是,您会发现没有一个正则表达式会匹配所有可能的数学表达式。事实上,数学表达式不是正则语言,因此正则表达式不足以解析它们。你可以研究一个语法解析器,比如 ,但这里的难度是严重的。ast


您还应该非常清楚使用的危险。恶意用户可以销毁运行此代码的计算机,因为它将作为 python 代码进行评估。想象(但不要尝试)以下字符串:eval


不要运行此代码


import shutil; 2 + 2; shutil.rmtree("X:\\", ignore_errors=True)


由于 将与该部分匹配,它将整个字符串评估为python代码,然后尝试删除X驱动器上的所有内容。将其替换为 C:\你有一个真正的问题。这显然不是你的本意。re.findall2 + 2


查看完整回答
反对 回复 2022-08-25
  • 1 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号