python eval 和字符串索引
假设我有一个字符串
string = '1234567890'
我想从这个字符串中提取出一部分,这部分是由另一个字符串来定义的
slice = '5:8'
这可以很简单地通过
>>>string[5:8]
'678'
来实现
不过,这个要提取的部分是通过一个文件传进来的,并且会根据用户的输入而变化。有没有什么方法可以做到类似于
>>>string[eval(slice)]
'678'
当我这样做的时候,我得到了
5:8
^
SyntaxError: invalid syntax
我有一个函数可以处理所有四种情况,我只是想知道有没有更优雅的方式来做到这一点。
谢谢大家的回答。
3 个回答
0
切片的语法不能单独使用在括号外面,所以如果你尝试单独执行它,程序会出错。如果你真的想从文件中执行输入,可以把完整的调用构建成一个字符串,然后再执行:
eval("string[" + slice + "]")
关于 eval
的一些常见警告也适用:如果有恶意用户,他们可以通过这种方式让你的程序执行任意代码,所以你可能更好地尝试解析边界,而不是直接使用 eval
。
1
这样怎么样:
string = '1234567890'
slice = '5:8'
sliceP = slice.split(':')
string[int(sliceP[0]):int(sliceP[1])]
3
你遇到语法错误是因为 5:8
这个表达式本身在 Python 中并不是一个有效的语句;eval
函数需要的是完整的 Python 代码,而不仅仅是一些片段。
如果你真的想使用 eval
,可以这样写:
string = '1234567890'
sliceInput = '5:8'
result = eval('string[' + sliceInput + ']')
不过,如果你允许用户输入,这样做是非常不安全的。更安全的做法是:
string = '1234567890'
sliceInput = '5:8'
sliceParts = sliceInput.split(':')
if len(sliceParts) != 2:
# Invalid input -- either no ':' or too many
else:
try:
start, end = [ int(x) for x in sliceParts ]
except ValueError:
# Invalid input, not a number
else:
result = string[start : end]
需要注意的是,slice()
是 Python 内置的一个函数,所以把它当作变量名来用并不是一个好习惯。