正则表达式包括负面的背后隐藏

时间:2013-10-10 02:45:33

标签: python regex

我正在尝试过滤字符串,然后在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
    })

1 个答案:

答案 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尝试很多值。