计算字符串中的匹配子字符串

时间:2016-09-09 19:23:16

标签: python

s = "abobabobabob"
total = 0

for i in range(len(s)):
    if s[i-1 : i+2] == 'bob':
        total += 1

print ('times bob occurs is:' + str(total))

是否有更简单的方法来更改if声明?另外,有人可以告诉我i-1 : i+2做了什么吗?

我编写了这段代码来查找" bob"我被困了一段时间。

4 个答案:

答案 0 :(得分:2)

你的if语句正在查看s的一个子集。为了回答你的另一个问题,这里有一个更简单的方法,比if语句更改:

这是python的正则表达式库

import re

嵌入式语句搜索' bob'的所有非重叠实例。并返回一个列表,每个匹配作为一个元素;外部语句只计算列表中元素的数量

len(re.findall('bob',s))

答案 1 :(得分:1)

以下代码搜索每个'bob'子字符串的起始索引,并将该值添加到数组中。 total变量只返回该数组中值的计数。

作为一个单行:

total = 0
s = "abobabobabob"

total = len([i for i in range(len(s)) if s.find('bob', i) == i])

print('times bob occurs is: ' + str(total))

<强>打印

times bob occurs is: 3

---如果您想要修改for循环,可以选择以下选项:

total = 0
s = "abobabobabob"

for i in range(len(s)):
    if (s.find('bob', i) == i):
        total += 1

print('times bob occurs is: ' + str(total))

<强>打印

times bob occurs is: 3

答案 2 :(得分:1)

如果s [i-1:i + 2] =='bob'正在检查当前索引-1到当前索引+ 2是否为'bob'。它会引起问题,因为我从0开始,而i-1是列表的最后一个元素

尝试:

s = "abobabobabob"
total = 0

for i in range(1,len(s)):
    if s[i-1 : i+2] == 'bob':
        total += 1

在两行中有更好的方法

s= "abobabobabob"
print sum(  s[i:i+3] =='bob' for i in range(len(s)-2) )

3

答案 3 :(得分:1)

使用enumerate()

s = "abobabobabob"
n = len([i for i, w in enumerate(s) if s[i:i+3] == "bob"])

print ('times bob occurs is:', n)

如果右边的字符+两个字符等于&#34; bob&#34;这将检查字符串s中的每个字符(按索引i)。

关于你的secundary问题:

在你的例子中:

s[i-1 : i+2]

是指字符串中字符的索引(i),其中s[0]是第一个字符,而s[i-1 : i+2] slice 字符串s,从当前字符-1(左边的那个)到当前字符+2(右边的第二个字符)。