2011-03-19 91 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])]