python eval和字符串索引

时间:2011-03-19 01:05:22

标签: python string

假设我有一个字符串

string = '1234567890'

我想要一个由另一个字符串

定义的字符串片
slice = '5:8'

这很容易用

>>>string[5:8]
'678'

但是,切片通过文件传入并更改用户输入。他们是一种做某事的方式,如

>>>string[eval(slice)]
'678'

当我这样做时,我得到了

    5:8
     ^
SyntaxError: invalid syntax

我有一个功能可以解释所有四种情况,我只是想知道他们是否是一种更优雅的方式。

感谢您的回答。

3 个答案:

答案 0 :(得分:2)

您收到语法错误,因为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函数,因此将它用作变量名称并不是一种好的做法。

答案 1 :(得分:1)

怎么样:

string = '1234567890'
slice = '5:8'
sliceP = slice.split(':')
string[int(sliceP[0]):int(sliceP[1])]

答案 2 :(得分:0)

在括号外不允许使用切片语法,因此如果您尝试自行评估它,它将会中断。如果你真的想要从文件中评估输入,你可以将完整的调用构造为字符串,然后评估它:

eval("string[" + slice + "]")

关于eval的常见警告适用:恶意用户可以让您的程序以这种方式执行任意代码,因此您可能最好不要尝试解析边界而不是eval