计算string中给定子string的出现次数

可能重复:
一个string中的子string的基本索引重复(python)

我如何计算一个给定的子string在Python中的string中存在的次数?

例如:

>>> 'foo bar foo'.numberOfOccurrences('foo') 2 

string.count(substring) ,如下所示:

 >>> "abcdabcva".count("ab") 2 

更新 :正如在评论中指出的那样,这是非重叠事件的方式。 如果你需要计算重叠的事件,你最好在“ Python正则expression式find所有重叠的匹配? ”来检查答案,或者只是检查我的其他答案。

根据你的意思,我提出以下解决scheme:

1)你指的是空格分隔的子string列表,想要知道所有子string中的子string位置编号是什么:

 s = 'sub1 sub2 sub3' s.split().index('sub2') >>> 1 

2)你的意思是string中子string的字符位置:

 s.find('sub2') >>> 5 

3)你的意思是一个string的外观(不重叠):

 s.count('sub2') >>> 1 s.count('sub') >>> 3 
 s = 'arunununghhjj' sb = 'nun' results = 0 sub_len = len(sb) for i in range(len(s)): if s[i:i+sub_len] == sb: results += 1 print results 

问题不是很清楚,但我会回答你的问题。

一个stringS,长度为L个字符,其中S [1]是string的第一个字符,S [L]是最后一个字符,具有以下子string:

  • 空string''。 有一个这样的。
  • 对于从1到L的每个值A,对于从A到L的每个值B,stringS [A]。S [B](含)。 这些string有L + L-1 + L-2 + …,总共为0.5 * L *(L + 1)。
  • 请注意,第二项包括S [1] .. S [L],即整个原始stringS.

因此,在一个长度为L的string中有0.5 * L *(L + 1)+ 1个子string。在Python中呈现该expression式,并且string中存在子string的数量。

涉及方法count的当前最佳答案并不是真正计算重叠的事件,也不关心空的子string。 例如:

 >>> a = 'caatatab' >>> b = 'ata' >>> print(a.count(b)) #overlapping 1 >>>print(a.count('')) #empty string 9 

如果我们考虑重叠的子串,第一个答案应该是2而不是1 。 至于第二个答案,最好是空的子string返回0 asnwer。

以下代码处理这些事情。

 def num_of_patterns(astr,pattern): astr, pattern = astr.strip(), pattern.strip() if pattern == '': return 0 ind, count, start_flag = 0,0,0 while True: try: if start_flag == 0: ind = astr.index(pattern) start_flag = 1 else: ind += 1 + astr[ind+1:].index(pattern) count += 1 except: break return count 

现在当我们运行它时:

 >>>num_of_patterns('caatatab', 'ata') #overlapping 2 >>>num_of_patterns('caatatab', '') #empty string 0 >>>num_of_patterns('abcdabcva','ab') #normal 2 

为了在Python 3中查找string中子string的重叠,这个algorithm将会:

 def count_substring(string,sub_string): l=len(sub_string) count=0 for i in range(len(string)-len(sub_string)+1): if(string[i:i+len(sub_string)] == sub_string ): count+=1 return count 

我自己检查了这个algorithm,它工作。

我将把我接受的答案作为“简单而明显的做法” – 但是,这不包括重叠事件。 找出这些可以天真地完成,通过多个检查切片 – 如在sum(“GCAAAAAGH”[我:]。startswith(“AAA”)我在范围内(len(“GCAAAAAGH”)))

(这产生3) – 可以通过使用正则expression式来完成,正如在Python正则expression式中可以看到所有重叠匹配一样? – 它也可以打出精美的代码打高尔夫球 – 这是我的“手工制作”计数string中的重叠模式,尽量不要太天真(至less它不会在每次交互中创build新的string对象):

 def find_matches_overlapping(text, pattern): lpat = len(pattern) - 1 matches = [] text = array("u", text) pattern = array("u", pattern) indexes = {} for i in range(len(text) - lpat): if text[i] == pattern[0]: indexes[i] = -1 for index, counter in list(indexes.items()): counter += 1 if text[i] == pattern[counter]: if counter == lpat: matches.append(index) del indexes[index] else: indexes[index] = counter else: del indexes[index] return matches def count_matches(text, pattern): return len(find_matches_overlapping(text, pattern)) 

重叠发生:

 def olpcount(string,pattern,case_sensitive=True): if case_sensitive != True: string = string.lower() pattern = pattern.lower() l = len(pattern) ct = 0 for c in range(0,len(string)): if string[c:c+l] == pattern: ct += 1 return ct test = 'my maaather lies over the oceaaan' print test print olpcount(test,'a') print olpcount(test,'aa') print olpcount(test,'aaa') 

结果:

 my maaather lies over the oceaaan 6 4 2 

如果你想找出任何string内的子串的计数, 请使用下面的代码。 代码很容易理解,这就是为什么我跳过评论。 🙂

 string=raw_input() sub_string=raw_input() start=0 answer=0 length=len(string) index=string.find(sub_string,start,length) while index<>-1: start=index+1 answer=answer+1 index=string.find(sub_string,start,length) print answer 

我不确定这是否已经被看到了,但我认为这是一个“一次性”的解决scheme:

 for i in xrange(len(word)): if word[:len(term)] == term: count += 1 word = word[1:] print count 

在哪里单词是你正在search的词, 术语是你正在寻找的术语

 string="abc" mainstr="ncnabckjdjkabcxcxccccxcxcabc" count=0 for i in range(0,len(mainstr)): k=0 while(k<len(string)): if(string[k]==mainstr[i+k]): k+=1 else: break if(k==len(string)): count+=1; print(count) 

你可以用两种方法来计算频率:

  1. 在str中使用count():

    a.count(b)中

  2. 或者,您可以使用:

    LEN(a.split(B)) – 1

其中“a”是string,“b”是要计算频率的子string。