丨量词与贪婪小小正则也可能把cpu拖垮_第1页
丨量词与贪婪小小正则也可能把cpu拖垮_第2页
丨量词与贪婪小小正则也可能把cpu拖垮_第3页
丨量词与贪婪小小正则也可能把cpu拖垮_第4页
丨量词与贪婪小小正则也可能把cpu拖垮_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在这6{m,n}来表示(*)(+)(?)这3表示量词的星号(*和加号()可能没你那么简单,我用一个例子给你讲解一下。我们先看一下加号(+),使用+在aabb对应的对应的Python代>>>import>>>re.findallr'a+',4a*aaabb以找到4个匹配结果。使用Python4代代>>>import>>>re.findall(r'a*',['aaa','','',4但这一次的结果匹配到了三次空字符串。为什么会匹配到空字符串呢?因为星号(*)0到多次,匹配0次就是空字符串。到这里,你可能会有疑问,如果这样,aaa部分应该这就引入了我们今天要讲的话题,贪婪与非贪婪模式。这两种模式都必须满足匹配次数的要求才能匹配上。贪婪模式,简单说就是尽可能进行最长匹配。非贪婪模式呢,则会尽可能进行最短匹配。正是这两种模式产生了不同的匹配结果。首先,我们来看一下在字符串aaabb中使用正则a*a*在匹配开头的a时,会尝试尽量匹配的a,直到第一个字母b不满足要求为止,匹配上三个a,后面每次匹配时都得到了空字符串。相信看到这里你也发现了,贪婪模式的特点就是尽可能进行最大长度匹配。所以要不要使用贪婪模式是根据需求场景来定的。如果我们想尽可能最短匹配呢?那就要用到非贪婪匹配模变成了a*?。此时的匹配结果如下:代代>>>importre.findall(r'a*','aaabb')#['aaa','','',>>>re.findall(r'a*?','aaabb')#['','a','','a','','a','','',aaregex=“xy{1,3}z”text=个,但字符串中后面是个z就会导致匹配不上,这时候正则就会向前回溯,吐出当前字符z,接着用正则中的z去匹配。regex=“xy{1,3}?z”text=由于y{1,3}?代表匹配1到3个y,尽可能少地匹配。匹配上一个y之后,也就是在匹配上text中的xy后,正则会使用z和text中的xy后面的y比较,发现正则z和y不匹配,这时正则就会向前回溯,重新查看y匹配两个的情况,匹配上正则中的xyy,然后再用z去匹配text中的z,匹配成功。回溯,这样的话就比较节省时间。具体的方法就是在量词后面加上加号(+)regex=“xy{1,3}+yz”text=“xyyz”Python和Go代代>>>import>>>re.findall(r'xy{1,3}+yz',error:multiplerepeatatposition4PyPIregex代代123456789注意:需要先安装regex模块,pipinstall>>>import>>>regex.findall(r'xy{1,3}z','xyyz')#>>>'xyyz')#>>>regex.findall(r'xy{1,2}+yz','xyyz')#JavaPerl如果你用a{1,3}+ab去匹配aaab字符串,a{1,3}+会把前面三个a都用掉,并且不会回溯,这样字符串中内容只剩下b了,导致正则中加号后面的a匹配不到符合要求的内容,匹配失败。如果是贪婪模式a{1,3}或非贪婪模式a{1,3}?都可以匹配上。这里我简单总结一下,独占模式性能比较好,可以节约匹配的时间和CPU资源,但有些情况下并不能满足需求,要想使用这个模式还要看具体需求(比如我们接下来要讲的案例另外还得看你当前使用的语言或库的支持程度。正则回溯 上的。Lazada卖家中心名代代1^([A-Za-z0-9._()&'\-2代代1^([符合要求的组成1]|[符合要求的组成你需要留意的是,正则中有个加号(+),这样会导致大量回溯,占用大量CPU资源,线上问题,我们只需要将贪婪模式改成占模式就可以解决这个问题。我之前,要根据具体情况来选择合适的模式,在这个例子中,匹配不上时证明名不合法,不需要进行回溯,因此我们可以使用独占模式,但要注意并不是说所有的场合都可以用独占模式解决,我们要首先保证正则能满足功能需求。仔细再看一下这个正则,你会发现“组成”和”部分中-Z-z英文字母在两个集合里面重复出现了,这会导致回溯后的重复判断。这里要强调一下,并不是说有回溯就会导致问题,你应该尽量减少回溯后的计算量,这些在后面的原理讲解中我们会进一步学另外,腾讯云技术社区也有类似的技术文章,你如果感,可以点击这里进行查 Somepeople,whenconfrontedwithaproblem,think“Iknow,I’lluseregularexpressions.”Nowtheyhavetwoproblems.所以一个小小的正则,有些时候也可能会把CPU拖垮,这也提醒我们在写正则的时候,一定要思考下回溯问题,避免使用低效的正则,线上问题。最后我来给你总结一下:正则中量词默认是贪婪匹配,如果想要进行非贪婪匹配需要在量词后面加上问号。贪婪和非贪婪匹配都可能会进行回溯,独占模式也是进行贪婪匹配,但不进行回溯,因此在一些场景下,可以提高匹配的效率,具体能不能用独占模式需要看使用的编程语言的类库的支持情况,以及独占模式能不能满足需求。有一篇英文文章,里面有很多单词,单词和单词之间是用空格隔开的,在引号里面的一到多个单词表示特殊含义,即引号里面的多个单词要看成一个单词。现在你需要提取出文章中所有的单词。我们可以假设文章中除了引号没有其它的标点符号,有什么方法可以解决这个问题呢?如果用正则来解决,你能不能写出一个正则,提取出文章中所有的单词呢(果去重)?wefound“thelittlecat”isinthehat,welike“thelittlethelittlecat 售卖。页面已增加防盗追踪,将依 上一 01|元字符:如何巧妙正则表达式的基本元件写写结合文中给的案例,知道了NFA和DFA(这个老师应该在后面讲匹配原理时会讲6这里是独占模式,不进行回溯。这里在尽可能多的匹配第三个y的时候匹配失败,不应该xyyzxyyz不就进行回溯了1 2xy{1,3}zxyyz2>>>import['','','','','','']1 111飞[a-11还有就是文章中的例子:xy{1,3}+yz去匹配xyyz,我的理解是用y{1,3}尽可能多的去匹xyy之后,用第三个yz,y一到三次独占模式,虽然只匹配到了两个,但还是满足了次数要求,这时候没失败,11 11\w+|“.+?”(10matches,74steps) \w+|“(.+?)”(10matches,104只要引号内的thelittlecatmthelittl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论