string.find Python中的索引

时间:2016-02-07 18:36:59

标签: python string

我正在尝试理解 为什么 以下python代码错误地返回字符串“dining”:

def remove(somestring, sub):
"""Return somestring with sub removed."""
    location = somestring.find(sub)
    length = len(sub)
    part_before = somestring[:location]
    part_after = somestring[location + length:]
    return part_before + part_after

print remove('ding', 'do')

我意识到使代码正确运行的方法是添加一个if语句,这样如果位置变量返回-1,它将只返回原始字符串(在本例中为“ding”)。例如,代码应为:

def remove(somestring, sub):
"""Return somestring with sub removed."""
    location = somestring.find(sub)
    if location == -1:
        return somestring
    length = len(sub)
    part_before = somestring[:location]
    part_after = somestring[location + length:]
    return part_before + part_after
print remove('ding', 'do')

不使用if语句来修复函数,part_before变量将返回字符串“din”。我很想知道为什么会这样。阅读string.find上的python文档(最终是如何制定part_before)我看到位置变量将变为-1,因为找不到“do”。但是如果part_before变量在-1索引之前保存所有字母,那么它不应该是空白而不是“din”吗?我在这里缺少什么?

作为参考,string.find的Python文档说明:

string.find(s, sub[, start[, end]])

返回s中找到子字符串sub的最低索引,使得sub完全包含在s [start:end]中。失败时返回-1。开始和结束的默认值以及负值的解释与切片相同。

2 个答案:

答案 0 :(得分:3)

string = 'ding'
string[:-1]
>>> 'din'

在python中使用负数作为索引返回右侧的 n 元素。因此,具有:-1的切片将返回除字符串的最后一个元素之外的所有元素。

答案 1 :(得分:1)

如果您有一个字符串'ding'并且您正在搜索'do',则str.find()将返回-1。 'ding'[:-1]等于'din''ding'[-1 + len(sub):]等于'ding'[1:],等于'ing'。将两者结合在一起可以实现“用餐”。要获得正确答案,请尝试以下方法:

def remove(string, sub):
    index = string.find(sub)
    if index == -1:
        return string
    else:
        return string[:index] + string[index + len(sub):]

string[:-1]不等于整个字符串的原因是在切片时,第一个数字(在这种情况下空白等于None,或者我们的目的等于0)是包容性的,但第二个数字(-1)是独占的。 string[-1]是最后一个字符,因此不包含该字符。