计算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)
你可以用两种方法来计算频率:
-
在str中使用count():
a.count(b)中
-
或者,您可以使用:
LEN(a.split(B)) – 1
其中“a”是string,“b”是要计算频率的子string。