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

一、暴力匹配算法

如果要匹配一个字符串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算法快三到五倍”。

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

  1. python 字符串匹配问题

    想匹配html = <div class="back fl"><a href="javascript:void(0);" onclick=&q ...

  2. 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith

    [C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...

  3. 使用Python做简单的字符串匹配

    由于需要在半结构化的文本数据中提取一些特定格式的字段.数据辅助挖掘分析工作,以往都是使用Matlab工具进行结构化数据处理的建模,matlab擅长矩阵处理.结构化数据的计算,Python具有与matl ...

  4. 字符串匹配的kmp算法 及 python实现

    一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

  5. Python做简单的字符串匹配详解

    Python做简单的字符串匹配详解 由于需要在半结构化的文本数据中提取一些特定格式的字段.数据辅助挖掘分析工作,以往都是使用Matlab工具进行结构化数据处理的建模,matlab擅长矩阵处理.结构化数 ...

  6. python实现 字符串匹配函数

    通配符是 shell 命令中的重要功能,? 表示匹配任意 1 个字符,*表示匹配 0 个或多个字符.请使用你熟悉的编程语言实现一个字符串匹配函数,支持 ? 和 * 通配符.如 "a?cd*d ...

  7. JavaScript 字符串匹配 | JS 的正则用法 | 从后边匹配

    // 字符串匹配命令是 match,不是 replace var text = "http://123.com/456.html" ; window.alert(text.matc ...

  8. leetcode笔记 动态规划在字符串匹配中的应用

    目录 leetcode笔记 动态规划在字符串匹配中的应用 0 参考文献 1. [10. Regular Expression Matching] 1.1 题目 1.2 思路 && 解题 ...

  9. 模糊字符串匹配:FuzzyWuzzy

    FuzzyWuzzy 模糊字符串匹配,它使用Levenshtein Distance来计算简单易用的包中序列之间的差异. 前置条件 Python 2.7 or higher difflib pytho ...

随机推荐

  1. 【Linq递归查找系列】

    Linq递归查找: public IEnumerable<MenuInfo> GetTree(int id, IEnumerable<MenuInfo> lst) { var ...

  2. 开启、关闭数据库mysql

    1.命令行 net start mysql net start mysql 2.点控制面板→管理→服务 招到mysql 3.找到安装目录下的bin目录

  3. Const和readonly这间的区别和相同处

    相同:  const和readonly都是用来修饰常量的 不同: const 在申明之前就要对它初始化,readonly修饰的常量则可以到构造函数中初始化 const注重的是效率但是readonly注 ...

  4. Android_ImageView

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  5. start mysqld on Mac server

    #!/bin/sh # Source the common setup functions for startup scripts test -r /etc/rc.common || exit 1 . ...

  6. 我给自己的Sass+Compass,在Windows下写个bat,快速cd到我的sass目录

    在Windows下,我总是要打开Ruby的cmd来进行Sass,其中要写好多cd,次数多了,自己的多敲,的确能记得更牢靠,但是无形中会浪费自己的一点点敲cd命令的时间,所以我想到自己在windows下 ...

  7. VS2010常用插件介绍之Javascript插件(一)

    引自:http://blog.csdn.net/cyxlzzs/article/details/6583577 今天在写JS时,写到500多行时,感觉代码已经很难看了.想到C#代码都有折叠功能,是不是 ...

  8. C#的类型、变量和值

    大学学了C#,工作也是使用C#,虽然在日常的开发中没什么大的问题,但个人觉得在C#的理解还不是很清晰,所以决定花一定的时间来理一理学过的知识,顺便革新下脑袋里的知识,因为坑爹的学校在教.net的时候, ...

  9. cmd 连接到指定路径

    cmd 刚刚打开的时候默认路径可能不是自己想要的路径的时候,如何转到自己希望的路径,方法如下: 1.首先敲下想存的硬盘符:D:   2.敲下 cd+文件路径:   总结:其实这次只是简单测试一下上传图 ...

  10. File的文件提取的小练习

    package com.java.Dmeo1.www; import java.io.File;import java.util.LinkedList;import java.util.TreeSet ...