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解释器理解Python中的字节码
Apr 01 Python
Python json模块使用实例
Apr 11 Python
详解Django中Request对象的相关用法
Jul 17 Python
Python Socket传输文件示例
Jan 16 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
PyQt5每天必学之事件与信号
Apr 20 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
python实现全盘扫描搜索功能的方法
Feb 14 Python
python实现图书借阅系统
Feb 20 Python
keras处理欠拟合和过拟合的实例讲解
May 25 Python
Django启动时找不到mysqlclient问题解决方案
Nov 11 Python
详解pandas映射与数据转换
Jan 22 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如何实现验证码
2016/01/20 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
2017/05/02 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
原生js调用json方法总结
2018/02/22 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
详解JavaScript事件循环机制
2018/09/07 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
用vue写一个日历
2020/11/02 Javascript
[01:13:17]Secret vs NB 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python入门篇之列表和元组
2014/10/17 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
团队精神演讲稿
2013/12/31 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
佛光寺导游词
2015/02/10 职场文书
二审答辩状格式
2015/05/22 职场文书
培养联系人考察意见
2015/06/01 职场文书