如何在字符串中查找一个单词字符的总出现次数?

-1 投票
3 回答
801 浏览
提问于 2025-04-18 10:40

我刚开始学Python,想在一个字符串里找一个子字符串。

比如说,我有一串固定的字母:

substring = 'sdkj'

还有一串字母:

string = 'sdjskjhdvsnea'

我想做一个计数器,统计在这个字符串中出现的字母 SDKJ 的数量。比如在上面的例子中,计数器的值会是 8

我该怎么做呢?

3 个回答

1

编辑:

看起来你确实想要统计这个四个字符的 substring 出现的次数,使用正则表达式可能是最简单的方法:

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

re.findall 可以给你一个包含所有(不重叠)出现的 substringstring 中的列表:

>>> 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
>>> 

撰写回答