首页 > 解决方案 > 如何在不计算的情况下验证数学表达式语法

问题描述

我正在尝试在 Python 3 中验证像(x + 5) * 3/y这样的数学表达式。我想用随机值替换 x 和 y,但在上面的示例中,如果 y 的 rand 值为 0,这将失败。

我搜索了如何在不评估结果的情况下验证表达式:

validate_expression("(x + 5) * 3/y hello world") # raise an exception
validate_expression("(x + 5) * 3/y") # do nothing

标签: pythonpython-3.xmath

解决方案


只要您的表达式遵循 Python 规则,您就可以使用它ast来验证它们:

import ast

expr = '(x + 5) * 3 ?'
try:
    ast.parse(expr)
    print('valid')
except SyntaxError:
    print('invalid')

正如评论中正确指出的那样,由于这会验证任何 python 代码,而不仅仅是数学表达式,因此您需要遍历已解析的 AST 以确保它不包含您不想要的东西,例如内置函数。


推荐阅读