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多线程编程方式分析示例详解
Dec 06 Python
理解Python垃圾回收机制
Feb 12 Python
简单学习Python time模块
Apr 29 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
创建Shapefile文件并写入数据的例子
Nov 26 Python
opencv设置采集视频分辨率方式
Dec 10 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
PyQt5的QWebEngineView使用示例
Oct 20 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
php模板中出现空行解决方法
2011/03/08 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
动态加载脚本提升javascript性能
2014/02/24 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
javascript基本语法
2016/05/31 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
Python3的socket使用方法详解
2020/02/18 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
Yahoo-PHP面试题1
2016/07/20 面试题
主管职责范文
2013/11/09 职场文书
教师个人读书活动总结
2014/07/08 职场文书
学校联谊协议书
2014/09/16 职场文书
培养联系人考察意见
2015/06/01 职场文书
大学生受助感言
2015/08/01 职场文书