如何在字符串中查找一个单词字符的总出现次数?
我刚开始学Python,想在一个字符串里找一个子字符串。
比如说,我有一串固定的字母:
substring = 'sdkj'
还有一串字母:
string = 'sdjskjhdvsnea'
我想做一个计数器,统计在这个字符串中出现的字母 S
、D
、K
和 J
的数量。比如在上面的例子中,计数器的值会是 8
。
我该怎么做呢?
3 个回答
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'
” 意思是试图在更大的 string
中找到这个完整的四个字符的 substring。在这种情况下,你似乎只是想要这四个字母出现次数的总和:
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
,而不是每次都遍历 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
1
这里有一个替代方案,使用了 re.findall()
这个函数:
>>> import re
>>> substring = 'sdkj'
>>> string = 'sdjskjhdvsnea'
>>> len(re.findall('|'.join(list(substring)), string))
8
2
希望这段代码能对你有所帮助:
>>> string = 'sdjskjhdvsnea'
>>> substring = 'sdkj'
>>> counter = 0
>>> for x in string:
... if x in substring:
... counter += 1
>>> counter
8
>>>