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 相关文章推荐
python将多个文本文件合并为一个文本的代码(便于搜索)
Mar 13 Python
Python 随机生成中文验证码的实例代码
Mar 20 Python
python实现代理服务功能实例
Nov 15 Python
讲解Python中fileno()方法的使用
May 24 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
python实现可视化动态CPU性能监控
Jun 21 Python
pytorch forward两个参数实例
Jan 17 Python
Python基于network模块制作电影人物关系图
Jun 19 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
在pyCharm中下载第三方库的方法
Apr 18 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 Python
python区块链实现简版工作量证明
May 25 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验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
php文件上传的两种实现方法
2016/04/04 PHP
Javascript Global对象
2009/08/13 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
JS实现li标签的删除
2019/04/12 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
python-视频分帧&amp;多帧合成视频实例
2019/12/10 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
Python字节单位转换(将字节转换为K M G T)
2021/03/02 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
教育实习生的自我评价分享
2013/11/21 职场文书
先进个人事迹材料
2014/01/25 职场文书
会计专业求职信范文
2014/03/16 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
优秀教师演讲稿
2014/05/06 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
英语复习计划
2015/01/19 职场文书
反腐倡廉观后感
2015/06/08 职场文书
小学副班长竞选稿
2015/11/21 职场文书
妇产科护理心得体会
2016/01/22 职场文书