字符串匹配的python实现

所有字符串匹配算法的核心问题是,当出现不匹配时,如何向后移动模式串

一、暴力匹配算法

如果要匹配一个字符串s 和一个模式串p,则从i=0开始依次匹配s[i:(i+len(p))],简单粗暴,代码如下:

def matcher(t, p):
    # param t: the string to check
    # param p: pattern
    n = len(t)
    m = len(p)
    for i in xrange(0, n-m+1):
        if p == t[i:i+m]: return True

二、KMP算法

参见:http://blog.csdn.net/v_july_v/article/details/7041827

简单来说,就是当匹配字符串s和模式串p时,当s[i]和p[j]不匹配时,不回溯S,而是将p右移一定位数开始匹配。所右移位数由以下规则确定:若p[j]前面的字符串最大长度的前后缀相同的字符串长度为L, 则右移(已匹配字符串长度—L),文字描述比较抽象,参见上面博客内容

def pmt(s):
    """
    PartialMatchTable
    """

    prefix = [s[:i+1] for i in range(len(s)-1)]
    postfix = [s[i+1]: for i in range(len(s)-1)]
    intersection = list(set(prefix) & set(postfix))    # 得到相同前后缀
    if intersection:
        return len(intersection[0])    # 得到最长前后缀
    return o

def kmp(t, p):
    # t: the string to check
    # p: pattern
    i = 0
    while i < len(t) - len(p) + 1:
        match = True
        for j in range(len(p)):
            if t[i+j] != p[j]:
                match = False
                break
            if match:
                return True
            # kmp
            if j:
                i += j - pmt(p[:j])
            else: i += 1
        return False

以上代码参考http://cnblogs.com/goodspeed/p/3295456.html

另外,还有BM算法,sunday算法以及horspool算法,后两种是迁移中的变种,“BM算法在实际应用中比KMP算法快三到五倍”。

时间: 2024-10-06 19:22:42

字符串匹配的python实现的相关文章

LeetCode | 1408. String Matching in an Array数组中的字符串匹配【Python】

LeetCode 1408. String Matching in an Array数组中的字符串匹配[Easy][Python][字符串] Problem LeetCode Given an array of string words. Return all strings in words which is substring of another word in any order. String words[i] is substring of words[j], if can be o

python 字符串匹配问题

想匹配html = <div class="back fl"><a href="javascript:void(0);" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='/u012582664/article/details/56845037';"><span&g

模糊字符串匹配:FuzzyWuzzy

FuzzyWuzzy 模糊字符串匹配,它使用Levenshtein Distance来计算简单易用的包中序列之间的差异. 前置条件 Python 2.7 or higher difflib python-Levenshtein(可选的,在字符串匹配中提供4-10倍的加速,不过在某些情况下可能导致不同的结果) 测试 pycodestyle hypothesis pytest 安装 使用PIP经由PyPI安装 或者用如下命令安装 使用PIP经由Github安装 添加你的requirementrequ

uva:10340 - All in All(字符串匹配)

题目:10340 - All in All 题目大意:给出字符串s和t,问s是否是t的子串.s若去掉某些字符能和t一样,那么t是s的子串. 解题思路:匹配字符.t的每个字符和s中的字符匹配.注意这里的字符数组大小要开大点. 代码: #include <stdio.h> #include <string.h> const int N = 1000005; char s[N], t[N]; bool match () { int i = 0; int lens = strlen(s);

CCF 字符串匹配

问题描述 试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时,表示同一个字母的大写和小写看作相同的字符. 输入格式 输入的第一行包含一个字符串S,由大小写英文字母组成. 第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小

字符串匹配的KMP算法

html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; color: ; background-color: ; margin: 0; padding: 16px 20px; } h1, h2, h

字符串匹配与KMP算法笔记

>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个一个进行比较, 如果不成功则模式串向右移动一个单位,直到匹配成功或者到达匹配串最后仍然不成功,返回失败. 很明显,这种算法有很多的地方可以优化,假设要搜索的串为S,长度为n,要匹配的串为M,长度为m,时间复杂度为O(nm). >>KMP算法 Knuth-Morris-Pratt算法以三个发明者命名

KMP算法解决字符串匹配

该算法由D.E.Knuth ,J.H.Morris和 V.R.Pratt提出,用于解决字符串匹配问题. 思想: 设目标串(主串)为s,模式串为t ,并设i指针和j指针分别指示目标串和模式串中正待比较的字符,设i和j的初值均为0.若有s[i]=t[j],则i和j分别加1.否则,i不变,j退回到j=next[j-1]的位置,再比较s[i]和t[j],若相等,则i和j分别加1.否则,i不变,j再次退回到j=next[j]的位置,依此类推.直到下列两种可能: 1. 模式串t中的字符全部匹配,则出现频率+

字符串匹配 【kmp】

字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 214 Solved: 81 Description 给你两个字符串A,B,请输出B字符串在A字符串中出现了几次. Input 多组测试数据,每组输入两个字符串.字符串的长度 <= 1000000. Output 输出B在A中出现的次数. Sample Input aaa aa Sample Output 1 子串在母串中出现的次数,串不重叠 #include <stdio.h> #