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利用elaphe制作二维条形码实现代码
May 25 Python
python中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
wxpython中利用线程防止假死的实现方法
Aug 11 Python
使用pyecharts无法import Bar的解决方案
Apr 23 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
解决pycharm无法调用pip安装的包问题
May 18 Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 Python
django序列化serializers过程解析
Dec 14 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
Pandas把dataframe或series转换成list的方法
Jun 14 Python
详解基于Scrapy的IP代理池搭建
Sep 29 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
社区(php&amp;&amp;mysql)四
2006/10/09 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
Vue实现圆环进度条的示例
2021/02/06 Vue.js
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
python next()和iter()函数原理解析
2020/02/07 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
python高阶函数map()和reduce()实例解析
2020/03/16 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
GUESS西班牙官方网上商城:美国服饰品牌
2017/03/15 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
团员学习总结的自我评价范文
2013/10/14 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
租房协议书
2014/04/10 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
python Tkinter模块使用方法详解
2022/04/07 Python