Python总结之 正则高级

原来写过一篇关于正则表达式的文章,这里再补充几个实际项目中用到的例子.注意:下面样例都是scala代码

1 捕获组命名

使用捕获组的时候,程序员可能需要趴在显示器上,用一张纸挡着屏幕,从左往右数括号,聚精会神好像拆弹,而且正则表达式一旦发生变化,group的index也会变.有洁癖的程序员不愿意忍受下面的代码中的那个2

val matcher = Pattern.compile("""(中标金额:|预算:)(\d+)元""").matcher("预算:4356元")if(matcher.find()) {  println(matcher.group(2))}

因此可以把捕获组命名

val matcher = Pattern.compile("""(中标金额:|预算:)(?\d+)元""").matcher("预算:4356元")if(matcher.find()) {  println(matcher.group("budget"))}

2 零宽度断言

零宽度断言只用来判断,而不会消费字符串,不会影响其他部分的匹配.

先举一个负向断言的例子,假设有几个文件全名,"file1.mp3", "file2.bat", "file3.txt",需要把文件名和扩展名都提取出来,在这个过程中,需要忽略所有bat文件.要是用普通代码实现,至少需要两个步骤——分隔和判断,但是正则表达式写一个就行了,用来面试别人,效果非常好

val pattern = Pattern.compile("""(\w+)\.(?!bat|mp3)(\w+)""")Array("file1.mp3","file2.bat","file3.txt").foreach(s=>{      val matcher = pattern.matcher(s)if(matcher.find()) {        println(matcher.group(1) +" "+ matcher.group(2))      }    })

至于正向断言,在2012年以后的很长一段时间,我都没想明白它到底有什么实际的作用,能用正向断言时为什么不用非捕获组.

后来终于找到了一个可以名正言顺使用正向断言的例子,用正则表达式来实现,效果拔群,立竿见影,感觉特别奇技淫巧.那就是密码强度判断,比如要求密码8到12位,必须有大小写字母和数字

val pattern = Pattern.compile("""^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{8,12}""")Array("qweqwe123","QWer56","QWEqwe123").foreach(s=>{      val matcher = pattern.matcher(s)      println(matcher.matches())    })

断言的好处是可以要求同时出现而且没有先后顺序

作者:大神带我来搬砖

链接://www.greatytc.com/p/31b13caa332c

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 1.正则表达式介绍 正则表达式算起来也是一个很庞大的语言系统,在所有的开发语言中基本都支持正则表达式,它可以很方便...
    babybus_superdo阅读 2,609评论 3 6
  • #首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用法 环视用法...
    mapuboy阅读 1,650评论 0 51
  • 各位60班的战友: 3月行将结束,我很荣幸在此期间陪伴各位战友度过了一段美好时光。在此感谢班长、2月的值月生浩群,...
    李子心诚阅读 240评论 0 0
  • 一颗贝壳爬进了我的沙堡 加紧些,再加紧些 赶在涨潮前,再垒上几座 听说海星也要住进来
    白首为童心阅读 216评论 0 0