2014-06-22 50 views
-1

我是Python的新手,我想在字符串中找到一個子字符串。如何查找一個字符串中字符出現的總次數?

舉例來說,如果我有一些恆定的字母,如子:

substring = 'sdkj' 

而一些字母,如一串:

string = 'sdjskjhdvsnea' 

我想打一個計數器,以便在在字符串中發現的任何字母S,D,KJ計數器將增加1.例如,對於上述示例,計數器將是8

我該如何做到這一點?

+0

請更新您的問題,以便很清楚你真正想要什麼,因爲你的問題和被接受的答案都不是' t match –

+0

@TimCastelijns被接受的answe的第二部分對於第一部分的問題完全適用於在子字符串中查找整個子字符串 – Hakar

回答

2

可能這個代碼可以幫助您:

>>> string = 'sdjskjhdvsnea' 
>>> substring = 'sdkj' 
>>> counter = 0 
>>> for x in string: 
...  if x in substring: 
...   counter += 1 


>>> counter 
8 
>>> 
+0

只是爲了澄清! 「if x in substring:」在「for x in string:」 - 循環中。有點難以看到。 – Willy

+0

是的,如果x ...在string中是x的話:loop。 –

+0

@hakar,只是想知道這是否是一個正確的答案,如果可以隨意標記爲正確的答案,否則我可以改進答案。謝謝。 –

1

編輯

正如你顯然希望整個四字substring的出場數,正則表達式是可能的最簡單的方法:

>>> import re 
>>> string = 'sdkjhsgshfsdkj' 
>>> substring = 'sdkj' 
>>> len(re.findall(substring, string)) 
2 

re.findall會給你的substring所有(非重疊)出場名單中string

>>> re.findall('sdkj', 'sdkjhsgshfsdkj') 
['sdkj', 'sdkj'] 

通常情況下,「找到一個子串'sdkj'將意味着試圖找到的是,出場完整的四字符substring範圍內較大的string。在這種情況下,看來,你只是想這四個字母的計數的總和:

sum(string.count(c) for c in substring) 

或者,更有效地使用collections.Counter

from collections import Counter 

counts = Counter(string) 
sum(counts.get(c, 0) for c in substring) 

這隻迭代string一次,而每個c in substring的比例爲O(m+n)而不是O(m*n)(其中m == len(string)n == len(substring))。

在行動:

>>> string = "sdjskjhdvsnea" 
>>> substring = "sdkj" 
>>> sum(string.count(c) for c in substring) 
8 
>>> from collections import Counter 
>>> counts = Counter(string) 
>>> sum(counts.get(c, 0) for c in substring) 
8 

注意,你可能想set(substring),以避免重複計算:

>>> sum(string.count(c) for c in "sdjks") 
11 
>>> sum(string.count(c) for c in set("sdjks")) 
8 
+0

進口重新 >>>字符串= 'sdkjhsgshfsdkj' >>>子= 'sdkj' >>> LEN(re.findall(子字符串))這個人是偉大的,但如何保存價值在這種情況下,在一個變量「計數器」?? – Hakar

+0

@Hakar呃......'counter = len(...)'?! – jonrsharpe

+0

是我固定在anotherway,但有一個問題: 什麼是子開始並以相同字母結尾,還是讓我來解釋一下一個例子 子=「SDK的」 字符串=「sdksjhgsdksdks」 – Hakar

1

使用re.findall()另一種解決方案:

>>> import re 
>>> substring = 'sdkj' 
>>> string = 'sdjskjhdvsnea' 
>>> len(re.findall('|'.join(list(substring)), string)) 
8 
+0

你真的想要包含'// 8'嗎? – jonrsharpe

+0

@jonrsharpe:嗯,這是一個意見。我應該用'#'代替。無論如何,更新! :) –

相關問題