改进 Python 函数以计算子字符串的出现次数

Improving Python function to count occurrences of a substring

我是一个相对缺乏经验的程序员(但总的来说相当有经验)并且正在寻求提高我的 Python 技能(我选择的语言)。我已经用 Python 编写了一些有用的工具,但我真的想将我的 programming/scripting 提升到一个新的水平。我理解其中的逻辑,但对图书馆的大部分内容都不熟悉。我一直在练习简单的编程任务 Python,我最近的练习示例是一个函数,它接受一个字符串和一个子字符串并输出字符串中子字符串的出现次数:

from re import match

def MyFunc(string, substring):
    n = len(substring)
    substring_count = 0
    x = 0
    for char in string:
        if match(substring, string[x:x+n]):
            substring_count = substring_count + 1
        x = x + 1
    return substring_count

这是一种有效的方法吗?我的代码特别 Pythonish 吗?我还尝试了另一种不使用正则表达式的解决方案,但没有那么成功。

使用字符串 count 方法获取主要内容中的替换次数。

Description:

string.count(s, sub[, start[, end]])

Return 子字符串 sub 在字符串 s[start:end] 中的(非重叠)出现次数。开始和结束的默认值以及负值的解释与切片相同。

例如

>>> a = "aabbbffgghhtt"
>>> a.count("ab")
1
>>> a.count("b")
3
>>> a.count("x")
0
>>> 

使用正则表达式进行非重叠搜索:

import re

def MyFunc(s, sub):
    return len(re.compile(re.escape(sub)).findall(s))

对于重叠:

def MyFunc(s, sub):
    n, m = len(sub), len(s)
    return sum(sub == s[i:i + n] for i in range(m - n + 1))

您要解决的问题是 Knuth Morris Pratt algorithm 更有效地完成的问题。

如果您只想使用内置 python 函数来使用自己的函数,请使用:

def MyFunc(string, substring):
    return string.count(substring)