Python实现字符串匹配算法代码示例


Posted in Python onDecember 05, 2017

字符串匹配存在的问题

Python中在一个长字符串中查找子串是否存在可以用两种方法:一是str的find()函数,find()函数只返回子串匹配到的起始位置,若没有,则返回-1;二是re模块的findall函数,可以返回所有匹配到的子串。

但是如果用findall函数时需要注意字符串中存在的特殊字符

蛮力法字符串匹配:

将模式对准文本的前m(模式长度)个字符,然后从左到右匹配每一对对应的字符,直到全部匹配或遇到一个不匹配的字符。后一种情况下,模式向右移一位。

代码如下:

def string_match(string, sub_str): 
 # 蛮力法字符串匹配 
 for i in range(len(string)-len(sub_str)+1): 
  index = i  # index指向下一个待比较的字符 
  for j in range(len(sub_str)): 
   if string[index] == sub_str[j]: 
    index += 1 
   else: 
    break 
   if index-i == len(sub_str): 
    return i 
 return -1 

if __name__ == "__main__": 
 print(string_match("adbcbdc", "dc"))

最坏情况下,该算法属于Θ(nm),事实上,该算法的平均效率比最差效率好得多。事实上在查找随机文本的时候,其属于线性的效率Θ(n)。

Horspool算法:

Horsepool算法是Boyer-Moore算法的简化版本,这也是一个空间换时间的典型例子。算法把模式P和文本T的开头字符对齐,从模式的最后一个字符开始比较,如果尝试比较失败了,它把模式向后移。每次尝试过程中比较是从右到左的。

在蛮力算法中,模式的每一次移动都是一个字符,Horspool算法的核心思想是利用空间来换取时间,提升模式匹配窗口的移动幅度。与蛮力算法不同的是,其模式的匹配是从右到左的,通过预先算出每次移动的距离并存于表中。

代码如下:

__author__ = 'Wang' 
from collections import defaultdict 
def shift_table(pattern): 
 # 生成 Horspool 算法的移动表 
 # 当前检测字符为c,模式长度为m 
 # 如果当前c不包含在模式的前m-1个字符中,移动模式的长度m 
 # 其他情况下移动最右边的的c到模式最后一个字符的距离 
 table = defaultdict(lambda: len(pattern)) 
 for index in range(0, len(pattern)-1): 
  table[pattern[index]] = len(pattern) - 1 - index 
 return table 
def horspool_match(pattern, text): 
 # 实现 horspool 字符串匹配算法 
 # 匹配成功,返回模式在text中的开始部分;否则返回 -1 
 table = shift_table(pattern) 
 index = len(pattern) - 1 
 while index <= len(text) - 1: 
  print("start matching at", index) 
  match_count = 0 
  while match_count < len(pattern) and pattern[len(pattern)-1-match_count] == text[index-match_count]: 
   match_count += 1 
  if match_count == len(pattern): 
   return index-match_count+1 
  else: 
   index += table[text[index]] 
 return -1 

if __name__ == "__main__": 
 print(horspool_match("barber", "jim_saw_me_in_a_barbershopp"))

显然,Horspool算法的最差效率属于属于Θ(nm)。在查找随机文本的时候,其属于线性的效率Θ(n)。虽然效率类型相同,但平均来说,Horspool算法比蛮力算法快很多。

总结

以上就是本文关于Python实现字符串匹配算法代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
Python实现控制台进度条功能
Jan 04 Python
Python selenium 三种等待方式解读
Sep 15 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
基于Django用户认证系统详解
Feb 21 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
Python判断有效的数独算法示例
Feb 23 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
利用python清除移动硬盘中的临时文件
Oct 28 Python
python如何利用cv2.rectangle()绘制矩形框
Dec 24 Python
Django实现简单分页功能的方法详解
Dec 05 #Python
Python生成8位随机字符串的方法分析
Dec 05 #Python
在Python程序员面试中被问的最多的10道题
Dec 05 #Python
Python对列表去重的多种方法(四种方法)
Dec 05 #Python
详解Python在七牛云平台的应用(一)
Dec 05 #Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 #Python
python调用Delphi写的Dll代码示例
Dec 05 #Python
You might like
在线竞拍系统的PHP实现框架(一)
2006/10/09 PHP
php 之 没有mysql支持时的替代方案
2006/10/09 PHP
PHP $_FILES函数详解
2011/03/09 PHP
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
jquery中动态效果小结
2010/12/16 Javascript
jQuery cdn使用介绍
2013/05/08 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
详解python中的json的基本使用方法
2016/12/21 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
python 魔法函数实例及解析
2019/09/25 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
会议活动邀请函
2014/01/27 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
导游词之广西漓江
2019/11/02 职场文书