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生成器实现微线程编程的教程
Apr 13 Python
python中引用与复制用法实例分析
Jun 04 Python
Python处理XML格式数据的方法详解
Mar 21 Python
python中的计时器timeit的使用方法
Oct 20 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
Python Map 函数的使用
Aug 28 Python
Django框架请求生命周期实现原理
Nov 13 Python
python实现PolynomialFeatures多项式的方法
Jan 06 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
Jan 15 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中数据的批量导入(csv文件)
2006/10/09 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
javascript 事件处理程序介绍
2012/06/27 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
python中xrange用法分析
2015/04/15 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
HTML的form表单和django的form表单
2019/07/25 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
keras之权重初始化方式
2020/05/21 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
毕业自荐书
2013/12/09 职场文书
材料物理专业个人求职信
2013/12/15 职场文书
大学生党课思想汇报
2013/12/29 职场文书
经营目标管理责任书
2014/07/25 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
投诉书格式范本
2015/07/02 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
React forwardRef的使用方法及注意点
2021/06/13 Javascript