正则表达式大家应该有了解过吧?它功能很强大,但有一个痛点就是不太容易读写,我们需要了解正则的很多语法规则才能写出一个健壮的正则表达式,很多朋友估计听到正则表达式估计都焦头烂额了。

就没有解决办法吗?

有的,今天给大家介绍一个可以让我们用“人类”的方式来写正则表达式的库,这个Python是技术群的一个伙伴分享的,今天分享给大家,独学而无友则孤陋而寡闻,喜欢本文点赞、关注、收藏。

目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式、添加微信号:dkl88191,备注:来自CSDN
  • 方式、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

Humre

没错,这个库就是 Humre,就是 Human(人类) + re(正则表达式) 的组合,单看这个名字还是很有来头啊。

GitHub 地址:https://github.com/asweigart/humre

PyPi:https://pypi.org/project/Humre/

这个库其实很新,第一次 commit 是在 2022/7/21,作者是 Al Sweigart,就是写 pyautogui 库(已有 7.1k star)的那个人,所以还是有一定可信赖度的。

这个库解决的问题就是让我们可以用更“人类”,也就是更语义化的方式编写正则表达式。

注意:当前时间(2022/9/4)这个库还没有发布 1.0 版本,所以相关 API 可能会更改,具体的最新 API 请参考原 GitHub 仓库的最新说明。

基本体验

OK,我们先来一个例子看看,比如我们我们现在要从一段文字中提取出一个电话号码,比如原文本如下:

Call 415-555-1234 today!

我们需要提取出其中的电话号码,那么用常规的正则表达式就是这么写的:

\d{3}-\d{3}-\d{4}

意思就是匹配“三个数字-三个数字-四个数字”,那么用 Python 就可以这么写:

from re import *text = 'Call 415-555-1234 today!'
regexStr = '\d{3}-\d{3}-\d{4}'
result = compile(regexStr).search(text)
print(result.group())

那么用 Humre 就可以写成这样:

from humre import *text = 'Call 415-555-1234 today!'
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,普通正则怎么写?

import re
re.compile('(?:(?:0x|0X)[0-9a-f]+)|(?:(?:0x|0X)[0-9A-F]+)|(?:[0-9a-f]+)|(?:[0-9A-F]+)')

感觉可读性怎么样?

那如果这时候换成 Humre 呢?就可以这样写:

from humre import *
compile(either(noncap_group(noncap_group(either('0x', '0X')), one_or_more(chars('0-9a-f'))),noncap_group(noncap_group(either('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 指的就是一个或更多,这样我们就可以清晰地知道这个正则表达式什么含义了。

再来一个例子,匹配一个带或不带逗号的数字,并且可以匹配小数点,那么普通正则就这样写:

import re
re.compile(r'(?:\+|-)?(?:(?:\d{1,3}(?:,\d{3})+)|\d+)(?:\.\d+)?')

颤抖吧!估计正则专家都不一定一眼读出来这是啥意思,有没有错误。

那用 Humre 怎么写呢?

from humre import *
compile(# optional negative or positive sign:optional(noncap_group(either(PLUS_SIGN, '-'))),# whole number section:noncap_group(either(# number with commas:noncap_group(between(1, 3, DIGIT), one_or_more(noncap_group(',', exactly(3, DIGIT)))),# number without commas:one_or_more(DIGIT))),# fractional number section (optional)optional(noncap_group(PERIOD, one_or_more(DIGIT))))

是不是又清晰了?

这里一共拆分为了三部分,正负号、数字、小数点,其中正负号和小数点都是可选的,所以可以加一个 optionalnoncap_group 照例还是整体匹配,然后有一些常量 PLUS_SIGN 就可以代表加号,between 就可代表从几到几。整体这么一拆分,并添加注释和分级,是不是可读性就大大增强了?

OK,到这里,体会到 Humre 的便捷之处了吧~

Humre 真的有必要吗?

在我看来,使用正则的人可能有两种:一种是刚不怎么会刚入门的,另一种是精通正则的。

如果是刚入门的,那有了 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 可能还会迭代,所以还不建议直接上生产环境。

如果真的要上生产环境,建议锁死版本号,避免带来潜在的问题。

总结

好了,这里主要就是给大家介绍下这个正则库,有了它,我们的正则表达式就可以变得更加清晰易读,希望对大家有帮助~

有了这个 Python 库,以后再也不用写正则表达式了相关推荐

  1. 学会python,妈妈再也不用担心我乱花钱了!

    显卡的价格总是被莫名其妙地炒得太高了.入手一台电脑的愿望总在计划中.是的,是我不配!(钱包正在努力)刚和同学吐槽完,他就丢给我满减购物优惠券,我震惊了."双十一都没有这么大力度,你怎么搞的? ...

  2. 6个免费商用图片素材库,再也不用担心版权问题了

    本期给大家分享6个免费可商用的视频素材网站,设计师.自媒体.视频剪辑有福啦,再也不用担心版权问题了,记得收藏起来哦~ 菜鸟图库 https://www.sucai999.com/pic.html#?v ...

  3. 123个Python***工具,再也不用问女朋友要手机密码了

    今天的文章来源于dloss/python-pentest-tools,本文中列举了123个Python***测试工具,当然不仅于***~ 下面我们就开始吧~ --------------------- ...

  4. 【效率】微软开源最强Python自动化神器!不用写一行代码!

    相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具.写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑. 虽然selenium有完备的文档,但也 ...

  5. 万能的Entry,两个变量的Model/JavaBean再也不用写了!

    2019独角兽企业重金招聘Python工程师标准>>> 前言 很多时候传数据需要只含两个变量的Model/JavaBean,但就为了两个变量去写一个Model/JavaBean实在是 ...

  6. 有了这个Python库,再也不愁给孩子起名字了

    后台回复1024,解锁无限快乐! 你是不是曾经为了给孩子起名字而左思右想,抓耳挠腮? 今天,我为你带来一款永久且快速的解决方案,让你再也不会为给孩子起名而苦恼了,无论生多少个,起名都信手拈来!!! 它 ...

  7. 用了Python,老板再也不用担心我写不了CUDA了!

    工具的发展驱动着人类文明不断进步,而这种变革始终以方便使用为根本导向.从原始社会到农耕社会,从蒸汽机到互联网,与每一次社会巨变伴随而来的无一不是生产力的极大解放.在高性能计算.人工智能等计算科技蓬勃发 ...

  8. 塔多漫画Python爬虫—妈妈再也不用担心我看漫画了

    塔多漫画使用了JavaScript加密无法直接找出漫画图片的真实地址,通过观察网页源代码发现真实的图片地址被加密过后存放在一个名为CP的变量中好在它自身已经给予了解密算法. function base ...

  9. 5个视频剪辑素材库,再也不用担心找不到素材了

    我一般都是在这几个网站找视频素材,高清无水印,免费还可以商用,也可以购买正版视频素材,各类视频素材都能找到,建议收藏起来! 1.菜鸟图库 https://www.sucai999.com/video. ...

  10. lombok快速入门:实体类中再也不用写setter和getter,toString等方法了

    1.默认情况下的实体类代码如下 package bean;public class Student {private int sid;private String sname;private Stri ...

最新文章

  1. EC20模块、主机休眠唤醒机制
  2. hdu3986 spfa + 枚举最短路上的边
  3. boost::mp11::mp_fold_q相关用法的测试程序
  4. 31.错误处理.rs
  5. 深度学习没有GPU怎么办?
  6. Bash脚本报错:“/bin/bash^M: bad interpreter: No such file or directory”
  7. JS实现图片循环滚动
  8. 安卓平板微信和手机微信同时登陆_Mac电脑如何同时登陆多个微信或QQ
  9. 用户 sa 登录失败。_Sqlserver2008R2特定用户只能查看管理指定的数据库
  10. 计算机 识别u盘 原理,电脑与USB3.0之间的识别过程,识别原理,高额金币悬赏!...
  11. AI永远不可能产生意识
  12. python自动化测试必备知识_2018教你应对Python移动自动化测试面试 面试分析 知识理论 面试技巧...
  13. 计算机无法u盘启动,电脑无法从u盘启动怎么办呢?
  14. 流程图、框图、UML图、类图
  15. 能不能算是PLSQL Developer的锅?
  16. 优秀自我简介200字_优秀学生自我介绍200字范文
  17. AliOS-Things--EMW3060使用笔记--GPIO
  18. 信息技术是指利用电子计算机和现代通信手段实现获取、传递、存储、处理、显示、分配信
  19. 商业银行的科技发展趋势
  20. 第三方开源项目名称_开源名称中有什么?

热门文章

  1. 格局炸裂,程序员必看的十部纪录片
  2. homeassistant搭建_安卓环境home assistant搭建
  3. 【机器学习笔记2】多元线性回归模型
  4. UFS Host基础特性分析 -- 硬件部分
  5. 牛客每日一题 飞扬的小鸟
  6. QCC3040---UI tones module
  7. D630,vista sp2,4GB Turbo Memory,ITMService.exe(SmartPinService),Posses lots of CPU Resources
  8. 求解字谜游戏问题-数据结构与算法分析-C语言描述 Mark Allen Weiss-第一章练习题
  9. Cross Apply 与 Outer Apply 的区别
  10. 华三路由器虚拟服务器设置,H3C vLNS系列虚拟L2TP网络服务器 配置指导-E0324-5W100...