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

一、暴力匹配算法

如果要匹配一个字符串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. 适合高级Java程序员看的12本书

    1.Thinking in Java 2.Head First Java 3.Java in a Nutshell 4.The elements of Java style 5.Effective J ...

  2. 在配置XML时报的The reference to entity "dataSource" must end with the ';' delimiter错误

    <?xml version="1.0" encoding="UTF-8"?> <ECharts> <element>http ...

  3. 常用linux命令和配置

      find只查看文件和只查看目录 find -type f -name clexec find -type d -name clexec   解压rpm [root@sj_x861 2]# ls e ...

  4. 由 Windows 向 Linux 迁移字体 和 Linux 等宽字体

    1. From Windows Windows下字体库的位置为C:\Windows\fonts,这里面包含所有windows下可用的字体.2. To Linux linux的字体库是 /usr/sha ...

  5. Android(java)学习笔记210:采用post请求提交数据到服务器(qq登录案例)

    1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...

  6. setValue 和 setObject 的区别

    在使用NSMutableDictionary 的时候经常会使用setValue forKey 与 setObject forKey,他们经常是可以交互使用的. 1.setValue forKey的定义 ...

  7. OpenJDK1.8 安装

    1. 安装JDK yum install -y java-1.8.0-openjdk-devel 2. 设置环境变量 /etc/profile文件增加 export JAVA_HOME=/usr/li ...

  8. asp.net后台获取前台的样式和后台给前台设置样式

    //获取到textbox1 的top值 Response.Write(textbox1.Style["top"]); //设置textbox1的style textbox1.Sty ...

  9. MySQL5.7.12新密码登录方式及密码策略

    在Centos6.6上安装MySQL5.7.12时,遇到了一个问题 安装后在/root目录下没有发现有.mysql_secret这个文件,所以没有没法按照官方文档上说的那样使用,这里记录下, 解决方式 ...

  10. SQL Server调优系列基础篇 - 常用运算符总结

    前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...