ast
您可以
ast用来获取表达式的树:
import astsource = '((81 * 6) /42+ (3-1))'node = ast.parse(source)def show_children(node, level=0): if isinstance(node, ast.Num): print(' ' * level + str(node.n)) else: print(' ' * level + str(node)) for child in ast.iter_child_nodes(node): show_children(child, level+1)show_children(node)
输出:
<_ast.Module object at 0x7f56abbc5490> <_ast.Expr object at 0x7f56abbc5350> <_ast.BinOp object at 0x7f56abbc5450> <_ast.BinOp object at 0x7f56abbc5390> <_ast.BinOp object at 0x7f56abb57cd0> 81 <_ast.Mult object at 0x7f56abbd0dd0> 6 <_ast.Div object at 0x7f56abbd0e50> 42 <_ast.Add object at 0x7f56abbd0cd0> <_ast.BinOp object at 0x7f56abb57dd0> 3 <_ast.Sub object at 0x7f56abbd0d50> 1
就像@
user2357112在评论中写道:
ast.parse解释Python语法,而不是数学表达式。
(1+2)(3+4)将被解析为函数调用,即使不应该将列表推导视为有效的数学表达式,也将接受列表推导。用正则表达式列出
如果您想使用扁平结构,则可以使用正则表达式:
import renumber_or_symbol = re.compile('(d+|[^ 0-9])')print(re.findall(number_or_symbol, source))# ['(', '(', '81', '*', '6', ')', '/', '42', '+', '(', '3', '-', '1', ')', ')']
它寻找:
- 多位数
- 或不是数字或空格的任何字符
一旦有了元素列表,就可以检查语法是否正确,例如使用a
stack来检查括号是否匹配,或者每个元素是否都是已知的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)