【问题标题】:Finding words in a string在字符串中查找单词
【发布时间】:2015-12-05 23:41:24
【问题描述】:

搜索了这个,但所有答案都超出了我的范围,因为我还在学习。我正在尝试查找字符串中某个单词的出现次数。我想出了以下代码,但不断得到奇怪的答案。

s = 'bobzbobz'


word = 'bob'



index = 0 
instance = []
while index < len(s):
    instance.append(s.find(word,index))
    index += 1
print len(instance) #instance = [0, 4, 4, 4, 4, -1, -1, -1]???? Why??

这应该打印 2,但我得到 8。原因是因为我的实例列表中有很多重复值。

【问题讨论】:

  • 如果这就是你想要的,s.count(word) 会为你做的:-)
  • 添加 -1 是因为当未找到子字符串时 find 返回 -1,您会不断获得 4,因为您只将索引移动一个位置就一直在寻找最后一个 bob
  • 要查看您的代码出了什么问题,请考虑当 index 为 1 时会发生什么...
  • @alexis,计数对重叠字符串不起作用

标签: python string list append


【解决方案1】:

find 的每次调用都将扫描字符串的其余部分,寻找从更下方开始的事件。所以你一直匹配相同的bob,直到你超越它。要准确检查每个位置一次,请使用不同的方法。一种可能性是简单地使用startswith()

n = 0
for i in range(len(s)):
    if s[i:].startswith("bob"):
        n += 1

或等效:

n = 0
for i in range(len(s)):
    if s.startswith("bob", i):
        n += 1

使用循环有各种各样的替代方法,但我认为这很好而且很清楚。

【讨论】:

    【解决方案2】:

    有很多更好的方法,但是在您的代码中,您需要检查 find 何时返回 -1 以查找不匹配项,并根据 find 在您获得匹配项时返回的内容来增加索引,您总是在追加并且只移动一个index 因此,如果以后有匹配项,您会继续找到相同的子字符串开始索引:

    s = 'bobobzbobz'
    word = 'bob'
    
    index = 0
    instance = []
    while index < len(s) - len(word):
        f = s.find(word, index)
        if f != -1:
            instance.append(f)
            index = f
        index += 1
    print (instance)
    [0, 2, 6]
    

    当您想要考虑重叠子字符串时,您不能使用.count,如上例所示。

    使用s = 'bobzbobz' 在每次迭代中分解它:

    s.find(word, 0) -> 0  # s[index:] -> 'bobzbobz' 
    s.find(word, 1) -> 4  # s[index:] ->  'obzbobz'
    s.find(word, 2) -> 4  # s[index:] ->  'bzbobz'
    s.find(word, 3) -> 4  # s[index:] -> 'zbobz'
    s.find(word, 4) -> 4 # s[index:] -> 'bobz'
    s.find(word, 5) -> -1 # s[index:] -> 'obz'
    s.find(word, 6) -> -1 # s[index:] ->  'bz'
    s.find(word, 7) -> -1 # s[index:] ->  'z'
    

    您在输出列表中得到四个 4,因为从索引 1 到索引 4 find 正在查找从索引 4 开始的子字符串单词,之后索引已移过最后一个 bob,即索引 4,因此您每次都添加了 -1因为 find 找不到匹配项。

    【讨论】:

      【解决方案3】:
      s = 'bobzbobz'
      word = 'bob'
      print s.count(word)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多