猿问

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

我试图使用python中的eval方法来评估写在字符串中的基本数学运算,但我首先检查字符串以确保没有任何问题发生,这样我就可以正确地使用eval()来评估我的字符串。


以下是我现在的一些代码:


import re

s = ("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,但由于某种原因,我没有得到它。由于某种原因,括号搞砸了一切。


我在正则表达式中做错了什么?


小唯快跑啊
浏览 152回答 1
1回答

呼唤远方

准确地写出您在正则表达式中断言的内容很有用。在这种情况下,它是:import repat = 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 repat = 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
随时随地看视频慕课网APP

相关分类

Python
我要回答