模式匹配

字符串与模式匹配算法(五):BMH算法

混江龙づ霸主 提交于 2019-12-04 19:08:22
一、BMH算法介绍    在BM算法的实际应用中,坏字符偏移函数的应用次数要远远超过好后缀偏移函数的应用次数,坏字符偏移函数在匹配过程中起着移动指针的主导作用。在实际匹配过程,只是用坏字符偏移函数也非常有效。1980年,奈杰尔·豪斯普(Nigel Horspool)提出了改进的BM算法,也就是BMH算法。简化了BM算法,执行非常方便,效率也很可观。Boyer-Moore算法使用两种策略来确定不匹配模式的位移:坏字符策略和高端策略。 来自Horspool的想法是仅使用坏字符策略,而不使用导致不匹配的字符,而始终使用文本窗口的正确字符。 二、主要思想    Horspool建议仅使用窗口最右边字符的坏字符移位来计算Boyer-Moore算法中的移位。 例如:    (a) Boyer-Moore 0 1 2 3 4 5 6 7 8 9 ... a b c a b d a a c b a b c a a b b c a a b   (b) Horspool 0 1 2 3 4 5 6 7 8 9 ... a b c a b d a a c b a b c a a b b c a a b   观察是上面两个不同算法的例子,后缀ab匹配,比较c-a表示不匹配。 Boyer-Moore算法(a)根据最后一次出现c的坏字符位置的策略确定滑动距离。 Horspool算法(b

初识正则表达式二

狂风中的少年 提交于 2019-12-04 18:50:12
一、预定义模式 预定义模式指的是某些常见模式的简写方式,简单说明如下: \d: 匹配0-9的任一数字,相当于[0-9] \D:匹配所有的0-9以外的字符,相当于[^0-9] \w:匹配任意的字母、数字和下划线,相当于[A-Za-z0-9] \W:除所有字母、数字和下划线 \s:匹配空格(包括制表符、空格符、断行符等) \S:匹配非空格的字符,相当于[^\t\r\n\v\f] \b:匹配词的边界 \B:匹配非词的边界,即在词的内部。 通常,正则表达式遇到换行符(\n)就会停止匹配,这时使用/s字符类,就能包括换行符。 也可使用非捕获组 二、重复类 模式的精确匹配次数,使用大括号({})表示。n表示恰好重复n次,{n,}表示至少重复n次,{n,m}表示重复不少于n次,不多于m次。 /lo{2}k/.test('look') //true /lo{2,5}k/.test(looook) //true 上面代码中,第一个模式指定o连续出现两次,第二个模式指定o连续出现2~5次 三、量词字符 量词用来设定某个模式出现的次数,具体说明如下: ?:表示某个模式出现0次或1次,等同于{0,1} *:表示某个模式出现0次或多次,等同于{0,} +:表示某个模式出现1次或多次,等同于{1,} 三:贪婪模式 var s='aaa'; s.match(/a+/) //["aaa"]

【翻译】Flink Table Api & SQL —Streaming 概念 —— 表中的模式匹配 Beta版

自作多情 提交于 2019-12-04 18:03:12
本文翻译自官网:Detecting Patterns in Tables Beta https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/streaming/match_recognize.html 搜索一组事件模式是一种常见的用例,尤其是在数据流的情况下。 Flink带有一个 复杂的事件处理(CEP)库 ,该 库 允许在事件流中进行模式检测。 此外,Flink的SQL API提供了一种关系查询方式,该查询具有一系列内置函数和基于规则的优化来表达查询,这些查询可以直接使用。 2016年12月,国际标准化组织(ISO)发布了SQL版本的新版本,其中包括SQL中的 行模式识别 ( ISO / IEC TR 19075-5:2016 )。 它允许Flink使用该 MATCH_RECOGNIZE 子句 合并CEP和SQL API,以 在SQL中进行复杂的事件处理。 MATCH_RECOGNIZE子句启用以下任务: 使用 PARTITION BY和ORDER BY子句一起逻辑分区和排序数据 。 使用 PATTERN 子句 定义要搜索的行模式 。 这些模式使用与正则表达式相似的语法。 行模式变量的逻辑组件在DEFINE子句中指定。 在 MEASURES 子句中 定义度量

fnmatch:Unix式glob模式匹配,简单场景下可以代替正则

旧时模样 提交于 2019-12-04 16:32:01
介绍 fnmatch模块用于根据glob模式(如Unix shell所使用的的模式)比较文件名 简单匹配 import fnmatch ''' fnmatch将一个文件名与一个模式进行比较,并返回一个布尔值,指示二者是否匹配。 如果操作系统使用一个区分大小写的文件系统,则这个比较就是区分大小写的 ?:匹配一个任意字符 *:匹配任意个任意字符 [sequence]:匹配出现在sequence里面的一个字符 [!sequence]:匹配没有出现在sequence里面的一个字符 [a-m]:匹配出现在abcdef...m中的字符 [A-M]:匹配出现在ABCDEF...M中的字符 [0-9]:匹配出现在0123...9中的字符 ''' # 虽说是用来匹配文件名的,但是我匹配普通的字符串也是可以的 # 注意返回的是一个bool值 print(fnmatch.fnmatch("abcde", "*")) # True print(fnmatch.fnmatch("abcde", "abc?")) # False print(fnmatch.fnmatch("abcde", "abc??")) # True print(fnmatch.fnmatch("abcde", "[a-z]????")) # True print(fnmatch.fnmatch("aaa", "aaa*")) #

字符串与模式匹配算法(四):BM算法

a 夏天 提交于 2019-12-04 14:20:38
一、BM算法介绍   BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的。与KMP算法不同的是,BM算法是模式串P由左向右移动,而字符的比较时由右向左进行。当文本字符与模式不匹配时,则根据预先定义好的“坏字符串偏移函数”和“好后缀偏移函数”计算出偏移量。   坏字符偏移和好后缀偏移这两个函数胡的原理可以简单描述为:当比较工作进行到文中的j处时,新一轮的比较从右向左进行。不相匹配的情况出现在模式字符串的P[i]=a以及目标字符串的T[i+j]=b处,那么这时有T[i+j+1,...,j+m-1]=P[i+1,...,m-1]且P[i]≠T[i+j]。   由好后缀偏移函数确定的偏移量分两种情况。首先,将模式字符串与目标字符串进行从右向左比较,当比较到字符P[i]时发现不同,则把T[i+j+1,……,j+m-1]=P[i+1],……,m-1]这一段看成u。如果在模式字符串里面u再次出现,且u的左侧是一个不同于a的前缀c时,则将模式字符串最右端再次出现的且前缀不是a的片段与文本串T[i+j+1,……,j+m-1]对齐,并将这次移动的偏移量存储在bmGs[i]中。    其次,如果u在模式中没有再次出现,或者再次出现但u前面的字符是a,那么就将片段T[i+j+1,……,j+m-1

Flink 复杂事物处理

旧巷老猫 提交于 2019-12-04 14:08:01
简介 FlinkCEP是在Flink之上实现的复杂事件处理(CEP)库。 它允许你在无界的事件流中检测事件模式,让你有机会掌握数据中重要的事项。 Flink CEP 首先需要用户创建定义一个个pattern,然后通过链表将由前后逻辑关系的pattern串在一起,构成模式匹配的逻辑表达。 可以应用的场景: 直播平台异常检测(扫X), 顺风车路径异常检测(XD) 等等..... Maven坐标 我下的是1.9.1 <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-cep_2.11</artifactId> <version>1.9.1</version> </dependency> 需要注意的是: 应用模式匹配的DataStream中的事件必须实现正确的equals()和hashCode()方法,因为FlinkCEP使用它们来比较和匹配事件。 入门 demo 场景: 用户登录, 在整个模式匹配的规则在5秒内,如果连续两次登录失败,则发出警告。。 代码: LoginEvent package com.ronnie.flink.demo.cep; public class LoginEvent { private String userId;//用户ID private String ip;//登录IP

python高级

荒凉一梦 提交于 2019-12-04 11:55:30
python高级 和is的使用 is 判断地址 比较两个引用是否指向了同一个对象(引用比较) 判断值 比较两个对象是否相等 深拷贝和浅拷贝 深拷贝 返回拷贝过的新对象 是对于一个对象所有层次的拷贝(递归) 浅拷贝 两个变量指向同一地址 是对于一个对象的顶层拷贝 拷贝的是引用 动态语言 运行时可以修改类和对象的内容,有__slots__约束属性值 生成器 generator 定义 在Python中,这种一边循环一边计算的机制,称为生成器 生成式 可对返回的值进行加工 yield 返回当前值,暂停 send 发送一个值 协程 两个方法交替执行,模拟多任务实现方式之一 迭代器 iterator 定义 迭代是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 可以使用for循环和next() 生成器是迭代器,迭代器不一定是生成器 判断是否可以迭代 引用一个集合的模块 from collections.abc import Iterable,Iterator isinstance(listA, Iterator) iter函数 可迭代对象转换为迭代器 装饰器 decorator 闭包 方法内部声明方法,内部方法引用外部方法的变量,外部方法返回内部的引用 定义 拓展函数功能的一种函数,

Linux文本三剑客

情到浓时终转凉″ 提交于 2019-12-04 11:26:04
```bash [root@CodeSheep ~]# ll /usr/bin/awk lrwxrwxrwx. 1 root root 4 Feb 15 2019 /usr/bin/awk -> gawk ``` ## 关于"三剑客"的特长 - grep 更适合单纯的查找和匹配文本 - sed 更适合编辑匹配的文本 - awk 更适合格式化文本,对文本进行较复杂格式处理 ## awk基础 **语法** awk [options] '{pattern + action}' {filenames} 其中的action 我们最常用的就是print以及prinf,对于action来说,每次经过一行,都会当前行执行一边action 比如 ```bash awk '{print "1",NR}' /etc/passwd ``` 你会发现有多少行,他就输出了多少个1 每行一个 ## awk的工作流程 首先awk并不是列操作,而是行操作,同样的他也是一行一行的处理的,其中$0表示当前行,比如在正常情况下我们输出全文是用cat来查看的,那么用awk的操作是这样的,另外awk的接受标准输入和文件 ```bash cat /etc/passwd awk '{print $0}' /etc/passwd # 如上的内容是一样的 ``` ## awk中的分隔符 为了处理好每一行中的每一个字段

D21_2.1_正则表达式_多字符匹配

若如初见. 提交于 2019-12-04 01:39:04
# (1) 量词基本语法 # 1) . 匹配1个除换行外的任意字符 # 2) ? 匹配0个或者1个a # 3) + 匹配1个或者多个a # 4) * 匹配0个或者多个a # 5) {m,n} 匹配m个至n个a,n可以取到 # {m,} 至少m次 # {m} 必须m次 # (2)贪婪模式与非贪婪模式 (若不加?,匹配的时候默认为贪婪模式) 贪婪模式 : 默认向更多次匹配 非贪婪模式: 默认向更少次匹配 贪婪模式在底层使用的是回溯算法: 回溯算法:默认从左向右进行匹配,一直到最后,直到最后再也匹配不到了,回头,找最后一个能够匹配到的数据 非贪婪模式: 在量词的后面加?,这个语法就是非贪婪,默认向更少次匹配 .?? .+? .*? .{1,25}? strvar = "刘能和刘德华和刘铁锤子777子888" #贪婪模式 print(lst = re.findall("刘.",strvar) ) #刘能 刘德 刘铁 print(lst = re.findall("刘.?",strvar) ) #刘能 刘德 刘铁 print(lst = re.findall("刘.*",strvar) ) #['刘能和刘德华和刘铁锤子777子888'] #非贪婪模式 print(lst = re.findall("刘.??",strvar))   #['刘', '刘', '刘'] print(lst =

字符串与模式匹配算法(二):MP算法

爷,独闯天下 提交于 2019-12-03 21:10:49
一、MP算法介绍   MP 算法是 一种快速串匹配算法 ,对 BF 算法的改进很大, 主要体现在匹配失败时,指针不用回溯,而是利用已经得到的“部分匹配”结果,将模式向右“滑动”若干位置后继续比较,避免了频繁回溯,普遍提高了匹配的工作效率,因此又被称为不回溯的字符串搜索算法。   假设有目标串T(t₀,t₁,t₂,t₃,……,t n-1 )和模式串P(p₀,p₁,p₂,p₃,……,p m-1 ),若使用BF算法进行模式匹配,第一轮比较时,若t k ≠p k, 则算法结束这轮比较 。    字符串T和P中第一个不相等的字符位置出现在位置k处,所以两串前k个字符是相等的,可以用字符串P(p₀,p₁,p₂,p₃,……,p k-1 )代替字符串T'(t₀,t₁,t₂,t₃,……,t k-1 ),于是原目标串可转化为T(p₀,p₁,p₂,p₃,……,p k-1, t k ,...,t n-1 )。在进行第二次比较之前,算法同样把字符串P 整体向后移动 一个字符,此时,T与P的关系:    在上面的比较中,首先比较的是 P中的首字符p 0 与 T中的第2个字符p 1 ,若与相等,则算法顺序比较 P中第2个字符P 1 与 T中第3个字符P 2 ,若不相等,则算法将模式串P整体向后移动一个字符,此时T与P之间的关系:    算法依照相同的次序,首先对 P中字符p 0 与 T中字符p 2 进行比较