2011-03-19 107 views
0

比方说,我有一个字符串蟒蛇评估和字符串索引

string = '1234567890' 

,我想用另一个字符串定义字符串的切片

slice = '5:8' 

这是很容易与

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

然而,切片通过文件传入并在用户输入上发生变化。难道自己做一些诸如

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

的一种方式。当我这样做,我得到

5:8 
    ^
SyntaxError: invalid syntax 

我有占这四种情况中的功能,我只是想知道,如果他们是一个更优雅这样做的方式。

感谢您的回答。

回答

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功能,所以它不被认为是很好的做法,把它作为一个变量名。

0

切片语法不允许在方括号之外,所以如果您尝试自行评估它,它将会中断。如果你真的想从文件EVAL输入,可以构建完整的呼叫作为一个字符串,然后EVAL它:

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

eval通常的警告适用于:恶意用户就可以让你的程序执行任意代码这样,所以你可能会更好地解析出界限,而不是他们的界限。

1

如何:

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