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 mysqldb连接数据库
Mar 16 Python
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 Python
Python算法应用实战之栈详解
Feb 04 Python
关于python2 csv写入空白行的问题
Jun 22 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
简单了解django索引的相关知识
Jul 17 Python
关于sys.stdout和print的区别详解
Dec 05 Python
keras中的History对象用法
Jun 19 Python
jupyter 添加不同内核的操作
Feb 06 Python
正确的理解和使用Django信号(Signals)
Apr 14 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+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
js中如何把字符串转化为对象、数组示例代码
2013/07/17 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
Python实现模拟登录及表单提交的方法
2015/07/25 Python
浅谈pyhton学习中出现的各种问题(新手必看)
2017/05/17 Python
Python实现的弹球小游戏示例
2017/08/01 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
python3 字符串知识点学习笔记
2020/02/08 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
新春联欢会主持词
2014/03/24 职场文书
《观舞记》教学反思
2014/04/16 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书