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查询Mysql时返回字典结构的代码
Jun 18 Python
Python爬虫爬验证码实现功能详解
Apr 14 Python
python 容器总结整理
Apr 04 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
python队列Queue的详解
May 10 Python
Pandas之DataFrame对象的列和索引之间的转化
Jun 25 Python
Django  ORM 练习题及答案
Jul 19 Python
对django layer弹窗组件的使用详解
Aug 31 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python shell命令行中import多层目录下的模块操作
Mar 09 Python
python使用smtplib模块发送邮件
Dec 17 Python
Keras多线程机制与flask多线程冲突的解决方案
May 28 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扩展” 的解决方法
2007/04/16 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
详解Python的Django框架中的中间件
2015/07/24 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
anaconda如何查看并管理python环境
2019/07/05 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
类的返射机制中的包及核心类
2016/09/12 面试题
商场消防演习方案
2014/02/12 职场文书
工商企业管理应届生求职信
2014/05/04 职场文书
安全施工标语
2014/06/07 职场文书
学习十八大标语
2014/10/09 职场文书
邀请书模板
2015/02/02 职场文书
公司辞职信模板
2015/05/13 职场文书
教师节随笔
2015/08/15 职场文书
2016银行求职自荐信
2016/01/28 职场文书
vue实现锚点定位功能
2021/06/29 Vue.js
MySQL 条件查询的常用操作
2022/04/28 MySQL
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技