我正在自动化我们的日常工作。这里我的代码将目录的绝对路径作为输入。它读取目录中按文件名排序的每个文件。然后它连接每个文件的内容以形成一个字符串。最后的连接字符串需要得到验证。如果string是有效的,那么如果它是无效的表达式,它将产生true,否则为false。我在想 有效表达式:“(a + b)* c +(d / e)',I 表达式无效:“(a + b”。
这是用于执行操作的代码。
from math import *
import os
import glob
Path = os.path.abspath("mydir/myfile.txt")
files = glob.glob(Path)
for name in files:
try:
with open(name) as f:
s+=f.read()
sys.stdout.write(s)
except IOError as exec:
if exc.errno != errno.EISDIR:
raise
def validateSyntax(a):
functions = {'__builtins__': None}
variables = {'__builtins__': None}
functions = {'acos': acos,
'asin': asin,
'atan': atan,
'atan2': atan2,
'ceil': ceil,
'cos': cos,
'cosh': cosh,
'degrees': degrees,
'exp': exp,
'fabs':fabs,
'floor': floor,
'fmod': fmod,
'frexp': frexp,
'hypot': hypot,
'ldexp': ldexp,
'log': log,
'log10': log10,
'modf': modf,
'pow': pow,
'radians': radians,
'sin': sin,
'sinh': sinh,
'sqrt': sqrt,
'tan': tan,
'tanh': tanh}
variables = {'e': e, 'pi': pi}
try:
eval(s,variables, functions)
except (SyntaxError, NameError, ZeroDivisionError):
return False
else:
pass
答案 0 :(得分:1)
好的,如果这会得到任何下选票,我会删除,但我真的认为这是对提出的问题的实际答案。
首先,欢迎来到SO,不要让任何可能让你心烦意乱的人放弃。我们都想帮忙,我们知道你在学习。我也是。但是,你必须回报,这是通过整齐,有条不紊地输入你的问题来完成的,并且表明你花费了不可忽视的时间来处理它。这意味着包括:
我可能正在背诵SO欢迎页面或者其他内容......无论如何,我已经为您整理了您的代码,并进行了快速的Google搜索,以便为您提供一些想法。
首先,请勿使用exec
来解决此问题。不是因为它“危险”,而是因为它是不必要的。它也会慢得多。让我们坚持角色处理。
经过90秒的Google搜索(数学表达式“验证器”python )后,我会使用http://codegists.com/snippet/python/math-expression-syntax-validator-of-parentheses-in-python-3
对于更复杂的事情,这看起来很不错http://effbot.org/zone/simple-top-down-parsing.htm
现在你去那里,你需要提供一个规范。希望至少有一些有用:)