正则表达式,你应该知道吧?功能很强大,但是有一个痛点就是不好读写。我们需要了解很多正则表达式的语法规则才能编写出健壮的正则表达式。很多朋友一听到正则表达式,估计都会觉得不知所措。没有解决办法吗?是的,今天我将向大家介绍一个库,它可以让我们以“人”的方式编写正则表达式。Humre没错,这个库就是Humre,是Human(人)+re(正则表达式)的组合,光看名字还是很有意思的。GitHub地址:https://github.com/asweigart/humrePyPi:https://pypi.org/project/Humre/这个库其实很新,第一次commit是2022/7/21,作者是AlSweigart,pyautogui库的作者(已经7.1kstar),所以还是有一定的可信度的。这个库解决的问题是让我们可以用更“人性化”,也就是更语义化的方式来编写正则表达式。》注:本库目前(2022/9/4)还没有发布1.0版本,所以相关API可能会发生变化,最新的具体API请参考原GitHub仓库的最新说明。》基本体验还可以,先举个例子,比如我们现在要从一段文字中提取电话号码,比如原文如下:Call415-555-1234today!我们需要提取电话号码,那么常规的正则表达式是这样写的:\d{3}-\d{3}-\d{4}表示匹配“三号-三号-四号”,那么用Python可以这样写:fromreimport*text='Call415-555-1234today!'regexStr='\d{3}-\d{3}-\d{4}'result=compile(regexStr).search(text)print(result.group())可以用Humre写成这样:fromhumreimport*text='Call415-555-1234today!'regexStr=exactly(3,DIGIT)+'-'+exactly(3,DIGIT)+'-'+exactly(4,DIGIT)result=compile(regexStr).search(text)print(result.group())你可以看到整个正则表达式变得语义化了,exactly指的是精确匹配,DIGIT指的是一个数,exactly(3,DIGIT)是三个数的精确匹配,也就是\d{3},结果是同样的:415-555-1234我们可以发现,这里只是把re库换成humre,然后修改regexStr,实现正则表达式的语义表示,是不是很简单?这时候有人说,我不感觉现在这个图书馆有什么优势呢,反而是更长了。好吧,我们再举个例子,求出所有的十六进制数。这个十六进制数可以以0x或0X为前缀。普通的正则表达式怎么写?importrere.compile('(?:(?:0x|0X)[0-9a-f]+)|(?:(?:0x|0X)[0-9A-F]+)|(?:[0-9a-f]+)|(?:[0-9A-F]+)')它的可读性如何?那么如果此时换成Humre呢?可以这样写:fromhumreimport*compile(either(noncap_group(noncap_group(either('0x','0X')),one_or_more(chars('0-9a-f'))),noncap_group(noncap_group(任('0x','0X')),one_or_more(chars('0-9A-F')),noncap_group(one_or_more(chars('0-9a-f'))),noncap_group(one_or_more(chars('0-9A-F')))))是不是清楚多了?either表示其中一个满足条件,然后传入四个参数。noncap_group表示对内容进行整体匹配,one_or_more表示一个或多个,这样我们就可以清楚的知道这个正则表达式是什么意思了。又比如,匹配一个带逗号或者不带逗号的数字,可以匹配小数点,那么正常的正则是这样写的:importrere.compile(r'(?:\+|-)?(?:(?:\d{1,3}(?:,\d{3})+)|\d+)(?:\.\d+)?')颤抖吧!估计是正规的高手,可能一眼看不出来这是什么意思,有没有错误。如何用Humre写它?fromhumreimport*compile(#可选的负号或正号:optional(noncap_group(either(PLUS_SIGN,'-'))),#整数部分:noncap_group(either(#带逗号的数字:noncap_group(between(1,3,DIGIT),one_or_more(noncap_group(',',exactly(3,DIGIT)))),#没有逗号的数字:one_or_more(DIGIT))),#小数部分(可选)optional(noncap_group(PERIOD,one_or_more(DIGIT))))又清楚了吗?这里分为符号、数字、小数点三部分。符号和小数点是可选的,所以可以加一个可选的,和noncap_group整体匹配,然后还有一些常量PLUS_SIGN可以表示加号,between可以表示从几到几。整体这样拆分,加上评论打分,可读性会不会大大增强?OK,来来来,你体会到Humre的便利了吗~Humre真的有必要吗?在我看来,使用regex的人可能有两种:一种是刚刚入门,一种是精通regex。如果你是刚刚入门,那么有了Humre,我们就不用太在意正则化的语法,上手也会快很多。如果你精通正则表达式,其实你可以针对某个功能需求很快的写出一个正则表达式,这是没有问题的。但是写出来之后,如果遇到问题想要排查,其实还是要费点功夫的。当然排错过程也可以使用很多优秀的正则表达式辅助工具,比如:https://regexr.com/https://regex101.com/这样排错就好了。但是到了维护阶段,或者说项目是别人维护的,不管是自己还是别人,其实都不太容易看出这个正则表达式的意思。因此,这种语义正则化对普通初学者和专家都有帮助。语义表了解了Humre的基本功能后,如果我们要使用它,只需要找到它的一些API函数即可,比如optional、nocap_group等是什么意思,正则表达式对应的功能有哪些,这里有一些常用的方法和含义总结:另外,一些常量的表达方式如下:另外,Humre也提供了一些常用的表达方式,比如十六进制HEXADECIMAL,参考如下:这里是一个简单的列表,但是最新的API推荐参考官方文档:https://github.com/asweigart/humre#quick-reference之后需要做什么?用这个库手写几个,感受一下,练几个就熟练了。温馨提示这个库当然好用,但是成熟起来可能还有一点时间。在1.0版本之前,里面的API可能还在迭代,所以不建议直接上生产环境。如果真的要上生产环境,建议锁定版本号,避免潜在问题。综上所述,这里主要是给大家介绍一下这个正则库。有了它,我们的正则表达式就可以变得更加清晰易读。希望对大家有所帮助~
