python eval 和字符串索引

1 投票
3 回答
2375 浏览
提问于 2025-04-16 14:00

假设我有一个字符串

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 内置的一个函数,所以把它当作变量名来用并不是一个好习惯。

撰写回答