无法在字符串中查找子字符串的所有位置并将列表附加到附加位置

时间:2018-05-20 23:28:48

标签: python python-3.x

我认为第一个块会附加一个列表,其中包含一个较大字符串中子字符串的所有匹配实例的位置。我将此应用于导入txt文件,但为了便于排除故障,我刚刚创建了importTxt。

def blahTxt():
    importTxt = ['blhaahblhaahhablahblahlahblahlablhaahlalablahahblahblha', 'blah']
    return importTxt

def main():
    myList = []
    s = blahTxt()[0]
    t = blahTxt()[1]
    for i in range(len(s)):
        if s[i:i] == t:
            myList.append(i)
    print(myList)
main()

以上代码不会返回位置,只会打印[]

def blahTxt():
    importTxt = ['blhaahblhaahhablahblahlahblahlablhaahlalablahahblahblha', 'blah']
    return importTxt

def main():
    myList = []
    s = blahTxt()[0]
    t = blahTxt()[1]
    for i in range(len(s) - len(t)): # added - length of t
        if s[i:i + len(t)] == t: # added + length of t
            myList.append(i)
    print(myList)
main()

当我运行此程序时,myList包含 s t 的所有位置。我在程序中添加了-len(t)和+ len(t),但我无法弄清楚为什么会这样。为什么我需要将 - len(t)添加到范围并将+ len(t)添加到if语句以使该程序生效?

2 个答案:

答案 0 :(得分:0)

将print(repr(s [i:i]),repr(s [i:i + len(t)]))添加到您的代码中。您将看到第一个返回一个空字符串。这是因为切片在右边打开...,在一般情况下[a:b]包括位置a但不是b的值。当你想到它时,它是有道理的。 [0:3]应该返回3件事,而不是4件。

答案 1 :(得分:0)

你可以这样想象:

s = 'blhaahblhaahhablahblahl ... ha'
t =               'blah'
#                  ^   ^
#                  |   |
#                s[i : i + len(t)]

s的子字符串由s[i : i+len(t)]指定,其方式适用于所搜索字符串的任何长度。

你应该阅读切片表示法,因为你会使用它很多。