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

Python 如何查找字符串中单词字符的总出现次数?,python,regex,string,substring,Python,Regex,String,Substring,我是Python新手,我想在字符串中找到一个子字符串 例如,如果我有一些常量字母的子字符串,例如: substring = 'sdkj' string = 'sdjskjhdvsnea' 和一串字母,例如: substring = 'sdkj' string = 'sdjskjhdvsnea' 我想制作一个计数器,这样在字符串中找到的任何字母S、D、K和J计数器都将递增1。例如,对于上述示例,计数器将为8 我如何才能做到这一点?这段代码可以帮助您: >>> string

我是Python新手,我想在字符串中找到一个子字符串

例如,如果我有一些常量字母的子字符串,例如:

substring = 'sdkj'
string = 'sdjskjhdvsnea'
和一串字母,例如:

substring = 'sdkj'
string = 'sdjskjhdvsnea'
我想制作一个计数器,这样在字符串中找到的任何字母
S
D
K
J
计数器都将递增1。例如,对于上述示例,计数器将为
8


我如何才能做到这一点?

这段代码可以帮助您:

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


>>> counter
8
>>> 
编辑

显然,您确实需要整个四字符
子字符串的外观计数,因此regex可能是最简单的方法:

>>> import re
>>> string = 'sdkjhsgshfsdkj'
>>> substring = 'sdkj'
>>> len(re.findall(substring, string))
2
将为您提供
字符串中
子字符串
的所有(非重叠)外观列表:

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

通常,“查找子字符串
'sdkj'
”意味着尝试在较大的
字符串中查找完整的四个字符
子字符串的外观。在本例中,您似乎只需要这四个字母的计数之和:

sum(string.count(c) for c in substring)
或者更有效地使用:

这只对
字符串
迭代一次,而不是对子字符串中的每个
c迭代一次,
O(m+n)
而不是
O(m*n)
(其中
m==len(string)
n==len(子字符串)

在行动中:

>>> 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
请注意,您可能希望避免重复计算:

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

另一种解决方案使用:


我只是想澄清一下!“if x in substring:”在“for x in string:”-循环中。有点难看。是的,对,如果x。。。是string:loop中x的内部。@hakar,只是想知道这是否是正确答案,如果是,请随意将其标记为正确答案,否则,我可以改进答案。谢谢。哦,非常感谢,它真的很有效,但是如果我们想在字符串中找到整个子字符串,例如,如果字符串是string='sdkjhsgshfsdkj',那么在这种情况下计数器等于2呢???@Hakar这是一个完全不同的问题,并且(根据我的回答)“查找子字符串”通常是什么意思.你真的想包括
//8
?@jornsharpe:Erm,那是一个评论。我应该用
#
来代替。无论如何,更新了!:)import re>>>string='sdkjhsgshfsdkj'>>>substring='sdkj'>>>len(re.findall(substring,string))2这个很好,但是在这种情况下如何将值保存在变量“counter”中???@Hakar uh<代码>计数器=len(…)
?!是的,我用另一种方式解决了这个问题,但有一个问题:什么是以同一个字母开头和结尾的子字符串,请让我在一个示例子字符串='sdks'string='sdksjhgsdksdks'@Hakar中解释一下,根据我已经链接到的文档,
re.findall
是不重叠的。如果你有重叠的子串,考虑一个或使用。我认为我的情况不是重叠的,因为我看了U的链接,如果子串的最后一个字母与最后一个字母相同,在字符串中,我们有一个字符串的连接,但是用相同的字母相同。例如:子字符串=“SDKS”字符串=“SDKSJHGSDKSDKJJHSDKS”,所以在这种情况下计数器将是三,因为有两个SDK和SDKSDK,它们将被当作两个不是一个,因为中间的S将是第一个的最后一个字母,第二个的第一个字母,请更新你的问题,这样就清楚了你真正的意思。想要,因为我是你的问题和公认的答案不需要match@TimCastelijns公认的answe的第二部分完美地解决了这个问题,正如第一部分在子串中找到一个完整的子串一样