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
添加回答
举报