我正在尝试过滤字符串,然后在python中传递eval
。我想将它限制为数学函数,但我不确定如何使用正则表达式去除它。请考虑以下事项:
s = 'math.pi * 8'
我希望它基本上转换为'math.pi * 8',删除空格。我还想删除[A-Za-z]
未跟随的任何字母math\.
。
因此,如果s = 'while(1): print "hello"'
,我希望剥离其中的任何可执行部分:
s理想情况下与():""
相同(所有字母都消失了,因为它们没有被math\.
跟随。
这是我试过的正则表达式:
(?<!math\.)[A-Za-z\s]+
和python:
re.sub(r'(?<!math\.)[A-Za-z\s]+', r'', 'math.pi * 8')
但结果为'.p*8'
,因为math.
后面没有math.
,i
后面没有math.
。
如何删除不在math
且未跟math.
的字母?
我跟着@Thomas的回答,但也从字符串中删除了方括号,空格和下划线,希望除了通过数学模块之外不能执行任何python函数:
s = re.sub(r'(\[.*?\]|\s+|_)', '', s)
s = eval(s, {
'__builtins__' : None,
'math' : math
})
答案 0 :(得分:2)
正如@Carl在评论中所说,看看lybniz does更好的东西。但即使这还不够!
链接中描述的技术如下:
print eval(raw_input(), {"__builtins__":None}, {'pi':math.pi})
但这并不妨碍像
这样的事情([x for x in 1.0.__class__.__base__.__subclasses__()
if x.__name__ == 'catch_warnings'][0]()
)._module.__builtins__['__import__']('os').system('echo hi!')
资料来源:Ned Batchelder关于沙盒的几篇文章,请参阅http://nedbatchelder.com/blog/201302/looking_for_python_3_builtins.html
编辑:指出我们没有方括号或空格,所以:
1.0.__class__.__base__.__subclasses__().__getitem__(i)()._module.__builtins__.get('__import__')('os').system('echo hi')
你只需要为i尝试很多值。