Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式包括负回溯_Python_Regex - Fatal编程技术网

Python 正则表达式包括负回溯

Python 正则表达式包括负回溯,python,regex,Python,Regex,我试图在通过python中的eval之前过滤字符串。我想把它限制在数学函数上,但我不知道如何用正则表达式去掉它。考虑以下事项: s = 'math.pi * 8' print eval(raw_input(), {"__builtins__":None}, {'pi':math.pi}) 我想把它基本上翻译成‘math.pi*8’,去掉空格。我还想去掉后面没有跟着math\.的字母[A-Za-z] 因此,如果s='而(1):打印“hello”,我希望剥离其中的任何可执行部分: 理想情况下,s

我试图在通过python中的
eval
之前过滤字符串。我想把它限制在数学函数上,但我不知道如何用正则表达式去掉它。考虑以下事项:

s = 'math.pi * 8'
print eval(raw_input(), {"__builtins__":None}, {'pi':math.pi})
我想把它基本上翻译成‘math.pi*8’,去掉空格。我还想去掉后面没有跟着
math\.
的字母
[A-Za-z]

因此,如果
s='而(1):打印“hello”
,我希望剥离其中的任何可执行部分:

理想情况下,s等于该场景中的
():“
(所有字母都消失了,因为它们后面没有
math\。

这是我试过的正则表达式:

(?<!math\.)[A-Za-z\s]+

正如@Carl在评论中所说的,看看什么能让事情变得更好。但即使这样也不够

链接中描述的技术如下:

s = 'math.pi * 8'
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 Batcheld关于沙箱的几篇文章,见

编辑:指出我们没有方括号或空格,因此:

1.0.__class__.__base__.__subclasses__().__getitem__(i)()._module.__builtins__.get('__import__')('os').system('echo hi')

如果您只是尝试了大量的i值。

此练习的目的是什么?如果您的真正目的是接受用户输入,然后使用
eval
进行评估,那么这不是一种非常安全的方法。提供了一种更安全的方法,并给出了很好的解释。这正是我所寻找的@carltheraw\u input()首先转换为字符串,去掉方括号和空格,所以我认为我或多或少是安全的。想法?此外,我只是尝试将上面的脚本传递到一个eval中,就像lybniz建议的那样,但它没有执行(如我所希望的那样)。给出了一个AttributeError:“dict”对象没有属性“import”。@bozdoz修复了,我忘记了
\uuuu builtins\uuuuu
是一个以某种方式重新格式化的dict。是的,它被触发了,即使在eval中设置了globals。不管怎样,我们传递的字符串带方括号,所以列表理解和dict键都不起作用。@bozdoz固定括号和空格