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中lambda的用法及其与def的区别解析
Jul 28 Python
python操作字典类型的常用方法(推荐)
May 16 Python
python基础梳理(一)(推荐)
Apr 06 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
Python3的高阶函数map,reduce,filter的示例详解
Jul 23 Python
python的等深分箱实例
Nov 22 Python
Python 求数组局部最大值的实例
Nov 26 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
Jan 03 Python
Python函数式编程实例详解
Jan 17 Python
Python列表嵌套常见坑点及解决方案
Sep 30 Python
Python实现GIF动图以及视频卡通化详解
Dec 06 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配置文件中最常用四个ini函数
2007/03/19 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
PHP创建XML接口示例
2019/07/04 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
JavaScript访问样式表代码
2010/10/15 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
JSON格式化输出
2014/11/10 Javascript
JSON取值前判断
2014/12/23 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Python 列表理解及使用方法
2017/10/27 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
python中使用print输出中文的方法
2018/07/16 Python
浅谈django的render函数的参数问题
2018/10/16 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
Python pymsql模块的使用
2020/09/07 Python
Python 串口通信的实现
2020/09/29 Python
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
教你怎样写好自我评价
2013/10/05 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
文明家庭事迹材料
2014/12/20 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers