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

时间:2015-02-25 16:20:50

标签: python performance substring

我是一个相对缺乏经验的程序员(但总体来说非常有经验),我正在寻求提高我的Python技能(我选择的语言)。我已经用Python编写了一些有用的工具,但我真的希望将我的编程/脚本编写到一个新的水平。我理解逻辑,但缺乏对大部分库的熟悉。我一直在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吗?我还尝试了另一种不使用正则表达式的解决方案,但并没有那么成功。

3 个答案:

答案 0 :(得分:2)

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

Description

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

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

e.g。

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

答案 1 :(得分:1)

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

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更有效地完成的任务。

答案 2 :(得分:0)

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

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