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 相关文章推荐
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python用模块pytz来转换时区
Aug 19 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
mac 安装python网络请求包requests方法
Jun 13 Python
Python for循环与range函数的使用详解
Mar 23 Python
Python读写文件基础知识点
Jun 10 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 Python
python selenium xpath定位操作
Sep 01 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 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的文章管理系统(二)
2006/10/09 PHP
smarty的保留变量问题
2008/10/23 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
json的使用小结
2016/06/08 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
JavaScript事件处理程序详解
2017/09/19 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
Python列表切片常用操作实例解析
2019/12/16 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
如何教少儿学习Python编程
2020/07/10 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
博士生导师推荐信
2014/07/08 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS