模式匹配

13.python内置模块之re模块

做~自己de王妃 提交于 2020-02-27 01:58:01
什么是正则? 正则表达式也称为正则,是一个特殊的字符序列,能帮助检查一个字符串是否与某种模式匹配。可以用来进行验证:邮箱、手机号、qq号、密码、url = 网站地址、ip等。正则不是python语言独有的技术,python语言直到1.5版本才将正则表达式完成的整理/纳入进re模块中,我们只需要导入re模块,然后就可以使用其中所有和正则相关的函数和属性了。 1. re 模块中最常用的几 个函数 1). re.match函数: 功能: 将string数据从头开始尝试匹配 ;如果匹配成功,那么就会返回给程序一个 match对象 ;如果开头就不匹配,那么直接返回None值; 语法格式: re . match ( regex , string[ , flags = 0] ) 参数: regex:匹配的正则表达式(内部定义了一套验证规则) string:需要被验证的字符串数据 flags:可选参,模式/标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。默认情况下(不显示定义) --> 不开启任何的模式 【注意】匹配成功re.match方法返回一个 匹配的对象 ,否则返回None。我们可以使用group(num) 或 groups() 等匹配对象函数来获取 匹配表达式 。match对象有5个常用的函数: (1). group(): 返回匹配成功的数据值(理解

从零开始学习MySQL全文索引

风流意气都作罢 提交于 2020-02-26 14:01:39
目录 一、为什么要用全文索引 二、什么是全文索引 三、如何创建全文索引 四、创建测试数据 五、查询-使用自然语言模式 六、查询-使用布尔模式(强大的语法) 语法 示例 七、查询-使用扩展模式 八、注意事项 一、为什么要用全文索引 传奇小说 m.xs86.com 我们在用一个东西前,得知道为什么要用它,使用全文索引无非有以下原因 like查询太慢、json字段查询太慢(车太慢了) 没时间引入ElasticSearch、Solr或者Sphinx这样的软件,或者根本就不会用(无法将五菱宏光换成兰博基尼,即使有兰博基尼也不会开) 加索引、联合索引啥的都已经慢得不行了(限速80,车顶盖都卸了也只能开到30) 为了提升一下自己的逼格(人家问你有没有开过法拉利,你说开过肯定更有气质一点) 二、什么是全文索引 简单的说,全文索引就相当于大词典中的目录,通过查询目录可以快速定位到想看的内容。 全文索引通过建立 倒排索引 来快速匹配文档(仅在mysql5.6版本以上支持) 全文索引将连续的 字母、数字和下划线 当做一个单词,分割单词一般用 空格/逗号/句号 MySQL的全文索引支持以下3种查询模式: 自然语言模式( IN NATURAL LANGUAGE MODE ) 通过MATCH AGAINST 传递某个特定的字符串来进行检索 布尔模式( IN BOOLEAN MODE ) 支持操作符,例如

PHP中的正则表达式及模式匹配

萝らか妹 提交于 2020-02-26 03:11:30
PHP中对于正则处理文本提供了两种方式,一种是PCRE方式(PCRE库是一个实现了与perl 5在语法和语义上略有差异(详见下文)的正则表达式模式匹配功能的函数集. 当前的实现对应于perl 5.005.);另一个是POSIX方式。 PCRE函数库中的函数使用的模式语法非常类似perl. 表达式必须用分隔符闭合, 比如一个正斜杠(/). 分隔符可以使任意非字母数字, 除反斜杠(\)和空字节之外的非空白ascii字符. 如果分隔符 在表达式中使用, 需要使用反斜线进行转义. 自php 4.0.4开始, 可以使用perl样式的(), {}, []以及<>作为分隔符. 更详细的解释参见模式语法. 结束分隔符后面可以紧跟模式修饰符来影响匹配效果. 参见模式修饰符. PCRE的模式修正符 i (PCRE_CASELESS) 如果设定此修正符,模式中的字符将同时匹配大小写字母。 s(PCRE_DOTALL) 如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。 m(PCRE_MULTILINE) 默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始

Python正则表达式(阿里云大学)

混江龙づ霸主 提交于 2020-02-26 01:05:09
Python正则表达式 正则表达式是用于信息筛选的工具,其地位非常重要 #使用格式如下 re.compile(正则表达式).findall(源字符串) 基础1 普通字符——正常匹配 \n——匹配换行符 \t——匹配制表符 \w——匹配字母、数字、下划线(也统称非特殊字符) \W——匹配除字母、数字、下划线 \d——匹配十进制数字 \D——匹配除十进制数字 \s——匹配空白字符 \S——匹配除空白字符 [sean010]——原子表,匹配sean010中的任意一个字符 [^sean010]——原子表,匹配除sean010中的任意一个字符 案例展示 基础2 .——匹配除换行外任意一个字符 ^——匹配开始位置 $——匹配结束位置 *——前一个字符出现0\1\多次 ?——前一个字符出现0\1次 +——前一个字符出现1\多次 {n}——前一个字符恰好出现n次 {n,}——前一个字符出现至少n次 {n,m}——前一个字符出现至少n次,至多m次 |——模式选择符或 ()——模式单元,想要什么内容就写什么 案例展示 注意上图*默认是贪婪,即尽可能多地匹配 基础3 贪婪模式(默认) 懒惰模式(精准模式),出现下面两种组合即为懒惰模式 *? +? 案例展示 上面一种为贪婪模式,下面一种为懒惰模式。 基础4 模式修正符:在不改变正则表达式的情况下,通过模式修正符使得匹配结果发生更改 re.S——让

JavaScript 正则表达式语法

 ̄綄美尐妖づ 提交于 2020-02-24 21:18:09
定义   JavaScript定义正则表达式有两种方法。 1.RegExp构造函数 var pattern = new RegExp("[bc]at","i");   它接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。 2.字面量 var pattern = /[bc]at/i;   正则表达式的匹配模式支持三种标志字符串: g :global,全局搜索模式,该模式将被应用于所有字符串,而并非搜索到第一个匹配项就停止搜索; i :ingore case,忽略字母大小写,即在确定匹配项时忽略模式和字符串大小写; m :multiple lines,多行模式,即在搜索到达一行文本末尾时会继续查找下一行是否有匹配项。   这两种创建正则表达式方法的不同之处在于,正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是新实例。 元字符   元字符是拥有特殊意义的字符,正则表达式的元字符主要有:   ( [ { \ ^ $ | ) ? * + .     在不同的组合中元字符有其不同的意义。 预定义特殊字符    字符类   简单类   一般情况下正则表达式一个字符对应字符串一个字符,但我们可以使用[]来构建一个简单的类,来表示符合某一特征的一类字符。例如:      [abc]可以匹配方括号中的a、b、c或其任意组合的字符。  

三步学通KMP

痴心易碎 提交于 2020-02-24 03:16:02
前言 谈到字符串模式匹配算法,莫过于最经典的KMP算法,它由D.E.Knuth,J.H.Morris和V.R.Pratt三位大牛于1977年联合发表提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法),KMP算法可以在O(n+m)的时间复杂度以内完成字符串的匹配操作,其核心思想在于:当一趟匹配过程中出现字符不匹配时,不需要回溯主串的指针,而是利用已经得到的“部分匹配”,将模式串尽可能多地向右“滑动”一段距离,然后继续比较。 说到KMP,也得需要提一下字符串的模式匹配的意义,这也是我们学习KMP及各种字符串匹配算法的意义。字符串的模式匹配是对字符串的基本操作之一,广泛应用于生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网络入侵检测等领域,如何简化其复杂性一直是算法研究中的经典问题。字符串的模式匹配实质上就是寻找模式串T是否在主串S 中,及其出现的位置。由于对字符串匹配的效率要求越来越高, 所以需要不断地改良模式匹配算法,减少其时间复杂度。 说到KMP,也感觉到数学世界的美妙,我们的祖先早在2000多年前就用阴阳(0,1)虚拟的分割了这个世界,而西方近代却用0、1(阴阳)在计算机里虚拟合成了这个世界;还有数学里的那些很奇怪而有趣的问题,比如杨辉三角, Kaprekar 常数,“421陷阱”等,不知道是不是与它们最终都能转化为0、1(阴阳)有关。好了,言归正传

LuaString库捕获和替换(标准库相关)

谁说我不能喝 提交于 2020-02-21 19:19:45
捕获(Captures) Capture3是这样一种机制:可以使用模式串的一部分匹配目标串的一部分。将你想捕获的模式用圆括号括起来,就指定了一个capture。 在 string.find 使用 captures 的时候,函数会返回捕获的值作为额外的结果。这常被用来将一个目标串拆分成多个: pair = "name = Anna" _ , _ , key , value = string . find ( pair , "(%a+)%s*=%s*(%a+)" ) print ( key , value ) -- > name Anna ‘%a+’ 表示菲空的字母序列;’%s*’ 表示 0 个或多个空白。在上面的例子中,整个模式代表:一个字母序列,后面是任意多个空白,然后是 ‘=’ 再后面是任意多个空白,然后是一个字母序列。两个字母序列都是使用圆括号括起来的子模式,当他们被匹配的时候,他们就会被捕获。当匹配发生的时候,find 函数总是先返回匹配串的索引下标(上面例子中我们存储哑元变量 _ 中),然后返回子模式匹配的捕获部分。下面的例子情况类似: date = "17/7/1990" _ , _ , d , m , y = string . find ( date , "(%d+)/(%d+)/(%d+)" ) print ( d , m , y ) -- > 17 7 1990

字符串模式匹配KMP算法

拥有回忆 提交于 2020-02-21 17:02:10
字符串模式匹配指的是,找出特定的模式串在一个较长的字符串中出现的位置。 朴素的模式匹配算法 很直观的可以写出下面的代码,来找出模式串在一个长字符串中出现的位置。 1: /* 2: 朴素的模式匹配算法 3: 功能:字符串的模式匹配 4: 参数: 5: s:目标串 6: p:模式串 7: pos:开发匹配的位置 8: 返回值: 9: 匹配成功,返回模式串在目标串的其实位置 10: 匹配不成功,返回-1 11: */ 12: int match(const char * s ,const char * p,int pos){ 13: int i = pos ; 14: int j= 0 ; 15: while(s[i] != '\0' && p[j] != '\0') { 16: if(s[i] == p[j]) { 17: i ++ ; 18: j ++ ; 19: }else { 20: i = i - j + 1; 21: j = 0 ; 22: } 23: } 24: 25: if(p[j] == '\0') 26: return i - j ; 27: else 28: return -1 ; 29: } 上面的代码,s就是目标串,p是模式串,pos指定从s的什么位置开始匹配p。其实现思想也很简单: 当s[i] == p[j]时,目标串和模式串的指针都向后移动一位,进行匹配

KMP算法

人走茶凉 提交于 2020-02-18 09:26:36
一、算法背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题。 Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常用算法之一,这个算法是由高德纳(Donald Ervin Knuth)和沃恩·普拉特在1974年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终三人于1977年联合发表。 在继续下面的内容之前,有必要在这里介绍下两个概念: 真前缀 和 真后缀 。 由上图所得, "真前缀"指除了自身以外,一个字符串的全部头部组合;"真后缀"指除了自身以外,一个字符串的全部尾部组合。 二、暴力匹配 这个算法的复杂度是O(n*m) 1 // n是P的长度,m是S的长度,返回P在S中出现的次数 2 int solve(char P[],int n,char S[],int m) // P是模式串,S是主串 3 { 4 int ans = 0; 5 int i,j; 6 for (i=0;i+n<=m;i++) 7 { 8 for (j=0;j<n;j++) 9 { 10 if (S[i+j] != P[j]) 11 break; 12 } 13 if (j == n) 14 ans++; 15 } 16 return ans; 17 } 三:KMP字符串匹配算法

java:正则表达式 --转http://blog.csdn.net/yangjiali014/archive/2007/06/19/1658235.aspx

别说谁变了你拦得住时间么 提交于 2020-02-15 05:44:05
正则表达式用来指定字符串模式。当你需要定位匹配某种模式的字符串时就可以使用正则表达式。例如,我们下面的一个例程就是在一个HTML文件中通过查找字符串模式<a href="...">来定位所有的超链接。 当然,为了指定一种模式,使用...这种记号是不够精确的。你需要精确地指定什么样的字符排列是一个合法的匹配。当描述某种模式时,你需要使用一种特殊的语法。 这里有一个简单例子。正则表达式 [Jj]ava.+ 匹配下列形式的任何字符串: 首字母是J或j 后续的三个字母是ava 字符串的剩余部分由一个或多个任意字符组成 例如,字符串“javaness”匹配这个特殊的正则表达式,但是字符串“Core Java”却不匹配。 如你所见,你需要了解一点语法来理解正则表达式的含意。幸运的是对于大多数的用途,使用少量的简单构造(straightforward constructs)就已足够。 字符类是可选自符的集合,用‘[’封装,比如[Jj],[0-9],[A-Za-z]或[^0-9]。这里的-表示范围(Unicode落在两个边界之间的所有字符),^表示求补(指定字符外的所有字符)。 有许多预定以的字符类,像\d(数字)或\p{Sc}(Unicode货币符号),见表12-8和12-9。 大多数字符与它们自身匹配,像上例中的ava字符。 符号.匹配任何字符(可能行终止符(line terminators