使用find。()在Python 3.5中查找重叠的子字符串

时间:2017-01-14 20:39:12

标签: python python-3.x find

我无法理解为什么我的find()工作/不工作。我试图计算'sas'的重叠子字符串'这第一个代码块工作并打印出3,我想要的结果。

x = 'sasidsasas'
sasnum = 0
iteration = 0

while True:
    iteration = x.find('sas', iteration)
    if iteration >= 0:
        iteration += 1
        sasnum += 1
    else:
        break

print(sasnum)

第二段代码不起作用(即打印出0)。

 x = 'sasidsasas'
sasnum = 0
iteration = 0

while True:
    iteration = x.find('sas', len(x))
    if iteration >= 0:
        iteration += 1
        sasnum += 1
    else:
        break

print(sasnum)

显然,我的问题围绕着find的第二部分。()。现在我相信在第一个代码块中发生的事情是,迭代值被设置为它找到的'sas'的开头加1,因此当它循环回来时它开始寻找下一个'sas'在字符串中。在第二个代码块中,我告诉它开始查看字符串的结尾,因此它会立即爆发。

这是正确的还是我认为这完全错了?

1 个答案:

答案 0 :(得分:1)

来自find的文档:

  

返回s中找到子字符串sub的最低索引,使得sub完全包含在s [start:end]中。失败时返回-1。

解决问题的第一部分:

  

现在我相信在第一个代码块中发生的事情是,迭代值被设置为“sas'的开头”。它找到加1,因此当它循环回来时,它开始寻找下一个“sas'在字符串中。

那是对的。这里发生了什么:

  1. 在第一次迭代find返回0,您将其分配给iteration并递增为1.

  2. 在下一次迭代中,find会考虑子字符串' asidsasas' (x[1:]),并将{5}分配给iterationx中的下一个' sas'),增加到6。

  3. 在第三次迭代中,find认为子字符串' asas' (x[6:])并在索引7处找到第三次出现的子字符串。这将被分配给iteration,然后增加到8。

  4. 在第四次迭代中,find无法再找到任何出现次数,因此返回-1导致while循环退出。

  5. 解决问题的第二部分:

      

    在第二段代码中,我告诉它开始查看字符串的结尾,因此它会立即爆发。

    第二个区块中发生的事情是,您要告诉开始查看字符串末尾的索引。这导致x.find返回-1(失败)。因为-1不大于或等于0,所以sasnum不会增加,并且会立即退出循环。

    所以是的,你也是对的。