文本字符分析python_Python实现字符串匹配算法代码示例

字符串匹配存在的问题

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算法比蛮力算法快很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日志 note_深入源码解析日志框架Log4j2(二)

异步AsyncAppender​log4j2突出于其他日志的优势&#xff0c;异步日志实现。我们先从日志打印看进去。找到Logger&#xff0c;随便找一个log日志的方法。public void debug(final Marker marker, final Message msg) {logIfEnabled(FQCN, Level.DEBUG, marker, msg, msg ! null…

垂死挣扎-1

进程控制块是描述进程状态和特性的数据结构&#xff0c;一个进程只能有惟一的进程控制块。 编译&#xff1a;进行语法检查、函数分配空间&#xff0c;将各个函数编译成二进制码&#xff0c;按照特定目标文件格式生成目标文件。连接&#xff1a;把程序中各个文件编译生成的目标文…

最近5年,诺贝尔化学奖都颁给了谁?

来源&#xff1a;科研圈诺贝尔化学奖&#xff08;瑞典语&#xff1a;Nobelpriset i kemi&#xff09;由诺贝尔基金会管理&#xff0c;每年颁发一次&#xff0c;用于表彰在化学各个领域作出杰出贡献的人。第一枚诺贝尔化学奖章于 1901 年授予荷兰物理化学家雅各布斯亨里克斯范托…

6-4 二叉树的非递归遍历 (25分)_本周小结!(二叉树)

给「代码随想录」一个星标吧&#xff01;❝以后每周加上一个本周小结怎么样&#xff1f;❞本周小结发现大家周末的时候貌似都不在学习状态&#xff0c;周末的文章浏览量和打卡情况照工作日差很多呀&#xff0c;可能是本周日是工作日了&#xff0c;周六得好好放松放松&#xff0…

vue导入swiper_vue项目中导入swiper插件的方法

这篇文章主要为大家详细介绍了vue项目中导入swiper插件的方法&#xff0c;具有一定的参考价值&#xff0c;可以用来参考一下。感兴趣的小伙伴&#xff0c;下面一起跟随512笔记的小编两巴掌来看看吧&#xff01;版本选择swiper是个常用的插件&#xff0c;现在已经迭代到了第四代…

设置MYSQL数据库编码为UTF-8

1、 编辑MySql的配置文件 MySql的配置文件Windows下一般在系统目录下或者在MySql的安装目录下名字叫my.ini&#xff0c;可以搜索&#xff0c;Linux下一般是/etc/my.cnf --在 [mysqld] 标签下加上以下内容&#xff1a; default-character-set utf8 character_set_server utf8…

5G核心网关键技术总览

来源&#xff1a;电子万花筒未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&…

samba安装_Centos安装Samba

1.先安装相关依赖以及库&#xff1a;yum install -y gcc-cyum install -y pcre pcre-develyum install -y zlib zlib-develyum install -y openssl openssl-devel2.下载nginx安装包&#xff1a;wget -c https://nginx.org/download/nginx-1.12.0.tar.gz然后直接解压tar -zxvf n…

c++函数为什么带imp_二次函数含参最值问题,老师怎么讲学生都不明白,试试这九张动图...

“一入函数深似海,从此数学是路人”很多同学都有这样的感觉。问&#xff1a;数学是从什么开始听不懂了&#xff1f;答&#xff1a;学函数的时候。函数问题作为中学阶段数学重要的知识点&#xff0c;真的是难倒了很多同学。数学老师也非常的痛苦&#xff0c;每次讲完函数问题&am…

解析 | 自动驾驶视觉定位与导航技术的研究与应用

来源&#xff1a;驭势未来视觉定位与导航技术是智能体具备的基础能力之一&#xff0c;随着无人驾驶的发展&#xff0c;基于低成本摄像头及人工智能算法的视觉定位与导航技术成为了无人驾驶的主流技术路线之一。在传统工作方式中&#xff0c;视觉定位与导航技术通常采用SLAM&…

c# 配置文件App.config操作类库

public class ConfigOperator{#region 从配置文件获取Value/// <summary>/// 从配置文件获取Value/// </summary>/// <param name"key">配置文件中key字符串</param>/// <returns></returns>public static string GetValueFromC…

visual studio 调试 定义debug常量_有趣的阅读 12个提高生产力的Visual Studio调试技巧...

以前因为工作的关系&#xff0c;接触过不少程序员同行&#xff0c;发现很多同学对所谓的小技巧tips感兴趣。本文就是一篇很有趣的文章&#xff0c;总结介绍了12个关于“宇宙第一IDE”—— Visual Studio的实用技巧。善加利用这些小技巧&#xff0c;能够在使用Visual Studio进行…

2016专接本c语言真题_云南特岗教师考试真题(中学信息技术)9套(无答案)

目录&#xff1a;1. 云南省2009年中央特岗计划教师招考试卷&#xff08;中学信息技术&#xff09;2. 云南省2010年中央特岗计划教师招考试卷&#xff08;中学信息技术&#xff09;3. 云南省2011年中央特岗计划教师招考试卷&#xff08;中学信息技术&#xff09;4. 云南省2013年…

淘金尖端领域:全球量子技术最新投资趋势

IBM50量子位量子计算机原型&#xff08;来源&#xff1a;IBM&#xff09;来源&#xff1a;资本实验室 作为一个少有人参与的尖端领域&#xff0c;量子技术除了在少数国家的政府部门与科研机构&#xff0c;以及科技巨头的推动之下缓慢成长&#xff0c;也正在通过越来越多的创业公…

teamviewer设备数量上限怎么解决_支小蜜刷脸支付设备解决方案,支小蜜刷脸支付设备怎么使用...

高校刷脸支付解决方案&#xff0c;用于解决高校消费场景支付需求&#xff0c;在线上通过高校人脸小程序完成学生认证&#xff0c;面容录入&#xff0c;开通刷脸支付。开通刷脸支付后&#xff0c;可以在学校内通过刷脸进行支付(校园食堂消费、校园超市消费等)。这个方案将支付宝…

字符串删除重复字符

ASCII编码对应的十进制为 0 到 127&#xff0c;对其 进行 强制类型转换后可转化为数组下标 将数组内元素初始值置为0&#xff0c;遇到一个元素第一次出现时&#xff0c;将数组内元素置为1&#xff0c;其后判断数组内元素不为0&#xff0c;则不再操作。 int myArray[128] {0}; …

[Matlab]函数表达式运算

MATLAB对函数表达式进行求和 有时候要进行函数表达式的计算 syms m; %m是符号&#xff0c;声明符号 f1exp(-im*1); f2exp(-im*2); ff1f2;%可以以符号的形式存储下来%计算% subs(f,m,1);%将f中的m替换为1&#xff0c;最好用单引号把变量括起来总结一下&#xff0c;syms用于声明…

reload vue 重新加载_vue面试,谈下router拦截

最近开始准备面试&#xff0c;尽管是电话面试全身还是充斥着紧张感&#xff0c;一面感觉还不错&#xff0c;主要是问react和vue的一些生命周期&#xff0c;介绍下redux...&#xff0c;二面印象深刻的是问到了介绍下router拦截&#xff0c;我觉得还是个人对router 的理解不够&am…

文小刚:创新就是孩子的游戏

来源&#xff1a; 返朴 撰文 | 文小刚 &#xff08;麻省理工学院终身教授、格林讲席教授&#xff09;1什么是创新应用科学&#xff08;工程技术&#xff09;的目的是利用已知的知识&#xff0c;创造社会价值&#xff0c;造福人类。而基础科学的目的是创造新知识&#xff0c;开拓…

bzoj1532: [POI2005]Kos-Dicing

1532: [POI2005]Kos-Dicing Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1520 Solved: 516[Submit][Status][Discuss]Description Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评…