模式匹配

学习:字符串----KMP算法

限于喜欢 提交于 2020-04-07 20:42:40
KMP算法 是判断一个字符串 (模式串) 是不是另一个字符串 (文本串) 的子串的常用算法,其中KMP算法的失配指针的概念(在本算法也叫 next数组 )在AC自动机中也有突出使用。 朴素的字符串匹配算法 朴素的字符串匹配算法,即判断文本串的 以每一个字符为开头,与模式串等长的子字符串 是否与 模式串 本身相等。很明显复杂度为为 O(mn),其中m为文本串的长度,n为模式串的长度。具体实现如下图 上图是一个字符串朴素匹配的示意图,长度为4的模式串与文本串每一个连续的长度为4的子串进行匹配判断,每一次匹配判断都需要一个个字符比较。 朴素匹配的代码: int StringMatch(string s, string p){ //s为文本串,p为模式串 int sLen = s.size(); int pLen = p.size(); int i = 0; //i遍历文本串下标,j遍历模式串下标 int j = 0; while (i < sLen && j < pLen){ if (s[i] == p[j]){ //相同i和j一起加1 i++; j++; } else{ i = i - j + 1; //i指向文本串下一个子串的第一个字符。 j = 0; //不相同,j重新指向模式串第一个字符 } } if (j == pLen) return i - j; else return

正则表达式中的常用模式

只谈情不闲聊 提交于 2020-04-07 17:12:00
正则表达式中的常用模式 下面是正则表达式中的一些常用模式。 /pattern/ 结果 . 匹配除换行符以外的所有字符 x? 匹配 0 次或一次 x 字符串 x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数 x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数 .* 匹配 0 次或一次的任何字符 .+ 匹配 1 次或多次的任何字符 {m} 匹配刚好是 m 个 的指定字符串 {m,n} 匹配在 m个 以上 n个 以下 的指定字符串 {m,} 匹配 m个 以上 的指定字符串 [] 匹配符合 [] 内的字符 [^] 匹配不符合 [] 内的字符 [0-9] 匹配所有数字字符 [a-z] 匹配所有小写字母字符 [^0-9] 匹配所有非数字字符 [^a-z] 匹配所有非小写字母字符 ^ 匹配字符开头的字符 $ 匹配字符结尾的字符 \d 匹配一个数字的字符,和 [0-9] 语法一样 \d+ 匹配多个数字字符串,和 [0-9]+ 语法一样 \D 非数字,其他同 \d \D+ 非数字,其他同 \d+ \w 英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样 \w+ 和 [a-zA-Z0-9]+ 语法一样 \W 非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样 \W+ 和 [^a-zA-Z0-9]+ 语法一样 \s 空格,和 [\n\t\r\f] 语法一样 \s

文本处理工具和正则表达式

三世轮回 提交于 2020-04-06 09:46:03
1 文本编辑工具之神VIM 1.1 vi和vim简介 在Linux中我们经常编辑修改文本文件,即由ASCII,Unicode或其他编码的纯文字的文件。 文本编辑种类: 全屏编辑器:nano(字符工具),gedit(图形化工具),vi,vim 行编辑器:sed vi Visual editor,文本编辑器,是Linux必备工具之一,功能强大,学习曲线较陡峭,学习难度大 vim VIsual editor iMproved,和vi使用方法一致,但功能更为强大。 1.2 使用vim初步 1.2.1 vim命令格式 vim [OPTION]... FILE... 常用选项 +# 打开文件后,让光标处于第#行的行首,+默认行尾 +/PATTERN 让光标处于第一个被PATTERN匹配到的行行首 -b file 二进制方式打开文件 -d file1 file2... 比较多个文件,相当于vimdiff -m file 只读打开文件 -e file 直接进入ex模式,相当于执行ex file 说明: 如果该文件存在,文件被打开并显示内容 如果该文件不存在,当编辑后第一次存盘时创建它 1.2.2 三种主要模式和转换 vim是一个模式编辑器,击键行为是依赖于vim的“模式” 三种常见模式: 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本 插入(Insert)或编辑模式

数据结构和算法(面试)

馋奶兔 提交于 2020-04-06 04:28:30
排序算法 直接插入排序 :将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过 希尔排序 :将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序 简单选择排序 :比较+交换 堆排序 :构建大顶堆进行排序 如何手写一个堆 1. 插入一个数 heap[ ++ size ] = x; up(size); 2. 邱集合当中的最小值 heap[1] 3. 删除最小值 heap[1] = heap[size]; size --; down(1); 4. 删除任意一个元素 heap[k] = heap[size]; size --; down(k); up(k); 5. 修改任意一个元素 heap[k] = x; down(k); up(k); 堆排序 int n, m; int h[ 1000 ], cnt; void down( int u ) { int t = u; if( u * 2 <= cnt && h[ u * 2 ] < h[ t ] ) t = u * 2; if( u * 2 + 1 <= cnt && h[ u * 2 + 1 ] < h[ t ] ) t = u * 2 + 1; if( u != t ) {

马哥博客作业第三周

戏子无情 提交于 2020-04-06 02:09:08
正则表达式 一.文本编辑工具 1.文本编辑之神vim 1.1 vim的三种模式: 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本 插入(Insert)或编辑模式:用于修改文本 扩展命令(extended command )或命令(末)行模式:保存,退出等 1.2 模式切换: 插入模式 --- ESC-----> 命令模式 命令模式 ---- : ----> 扩展命令模式 扩展命令模式 ----ESC,enter----> 命令模式 1.3 扩展模式的基本命令 w 写(存)磁盘文件 wq 写入并退出 x 写入并退出 X 加密 q 退出 q! 不存盘退出,即使更改都将丢失 r filename 读文件内容到当前文件中 w filename 将当前文件内容写入另一个文件 !command 执行命令 r!command 读入命令的输出 1.4 命令模式的基本命令 ZZ 保存退出 ZQ 不保存退出 1.4.2 光标跳转 字符间跳转: h: 左 L: 右 j: 下 k: 上 单词间跳转: w:下一个单词的词首 e:当前或下一单词的词尾 b:当前或前一个单词的词首 当前页跳转: H:页首 M:页中间行 L:页底 zt:将光标所在当前行移到屏幕顶端 zz:将光标所在当前行移到屏幕中间 zb:将光标所在当前行移到屏幕底端 行首行尾跳转: ^ 跳转至行首的第一个非空白字符

Python正则表达式,这一篇就够了!

三世轮回 提交于 2020-04-02 00:12:45
大多数编程语言的正则表达式设计都师从Perl,所以语法基本相似,不同的是每种语言都有自己的函数去支持正则,今天我们就来学习 Python中关于 正则表达式的函数。 re模块主要定义了9个常量、12个函数、1个异常,每个常量和函数猪哥 都会通过实际代码案例讲解,让大家能更直观的了解其作用! 注:为避免出现代码格式错乱,猪哥尽量使用代码截图演示哦。 一、re模块简介 聊到Python正则表达式的支持,首先肯定会想到 re 库,这是一个Python处理文本的 标准库 。 标准库 的意思表示这是一个 Python内置模块 ,不需要额外下载,目前Python内置模块大概有300个。可以在这里查看Python所有的内置模块:https://docs.python.org/3/py-modindex.html#cap-r 因为re是内置模块,所以不需要再下载,使用时直接引入即可: import re re模块官方文档:https://docs.python.org/zh-cn/3.8/library/re.html re模块库源码:https://github.com/python/cpython/blob/3.8/Lib/re.py 二、re模块常量 常量即表示不可更改的变量,一般用于做标记。 re模块中有9个常量,常量的值都是int类型! 上图我们可以看到,所有的常量都是在

springboot mq docker

放肆的年华 提交于 2020-03-30 22:15:12
作为自己熟悉几种常用mq中间件的过程记录 持续更新 rabbitmq 安装部分 2019.1.24 docker pull rabbitmq:management docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 镜像id netstat -atnlp查看端口占用 跑起来rabbitmq后日志正常无问题 但访问15672 无返回值,搜了俩小时资料 换了各种包也不好用,明天问问老大吧,初步怀疑可能是防火墙/端口未开放的事,但搜了开放端口的各种命令也不好用。。先看看activemq吧 2019.1.25 继续rabbitmq 先装好再说吧。。 今天学到了查看端口占用情况的命令 netstat -tunlp netstat -tunlp|grep 15672 sudo yum install lsof y lsof -i :15672 端口也监听上了 15672的state也是listen了 问了微信群 认为的大致问题为 1.映射的端口不对 2.没有暴露到外部 3.镜像使用错误(没有management,不带managementg-plugin) 4.启动后 附加management命令才启动界面 但上面的4个问题要么能自己确认没有问题,要不就是不会,不知道怎么排查。但群友提出了docker hub上的截图,决定去看看

正则表达式是常见常忘,所以还是记下来比较保险,于是就有了这篇笔记。

China☆狼群 提交于 2020-03-30 10:12:08
Regular Expressions (1) ---- What is Regular Expressions? 正则表达式是常见常忘,所以还是记下来比较保险,于是就有了这篇笔记。 希望对大家会有所帮助。J 1.什么是正则表达式 2 2.正则表达式的起源 2 3. 正则表达式使用祥解 3 3.1基本语法 3 3.1.1普通字符 3 3.1.2非打印字符 3 3.1.3特殊字符 3 3.1.4字符集 4 3.1.5在字符集中使用元字符 5 3.1.6预定义字符集 5 3.1.7 限定符 6 3.1.8定位符 6 3.1.9 “.”元字符 7 3.1.10用 “|”表示选择 8 3.1.11用 “()”表示分组 8 3.1.12 “?”的补充说明 8 3.1.13给正则表达式添加注释 8 3.1.14操作符的运算优先级 8 3.2 高级话题 9 3.2.1反向引用 9 3.2.2在正则表达式中指定模式option 9 3.2.3 Lookaround断言 10 4. 正则表达式基本语法索引 11 5. 正则表达式高级语法索引 15 6. 参考资料 17 7. 推荐工具 17 1.什么是正则表达式 简单的说,正则表达式是一种可以用于文字模式匹配和替换的强有力的工具。是由一系列普通字符和特殊字符组成的能明确描述文本字符串的文字匹配模式。 正则表达式并非一门专用语言,但也可以看作是一种语言

Python正则表达式指南

限于喜欢 提交于 2020-03-28 05:11:40
本文转自 AstralWind 的博客: Python正则表达式指南 特来收藏 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。 下图展示了使用正则表达式进行匹配的流程: 正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。 下图列出了Python支持的正则表达式元字符和语法: 1.2. 数量词的贪婪模式与非贪婪模式 正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?"

同步 异步 阻塞 非阻塞

我的未来我决定 提交于 2020-03-28 03:52:56
同步:函数没有执行完不返回,线程被挂起;   阻塞:没有收完数据函数不返回,线程也被挂起;   异步:函数立即返回,通过事件或是信号通知调用者;   非阻塞:函数立即返回,通过select通知调用者 这样看来异步和非阻塞有什么区别呢? 异步=非阻塞? 同步是在操作系统层面上,阻塞是在套接字上? Reactor是同步 Proactor是异步? 回答: 同步、异步、阻塞和非阻塞的概念   在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。下面是我对这些术语的理解。 同步   所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin,isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的LRESULT值返回给调用者。 异步   异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以CAsycSocket类为例(注意,CSocket从CAsyncSocket派生