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

news/2024/5/21 15:26:47/文章来源:https://blog.csdn.net/weixin_38037405/article/details/126982627

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

就没有解决办法吗?

有的,今天给大家介绍一个可以让我们用“人类”的方式来写正则表达式的库,这个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 可能还会迭代,所以还不建议直接上生产环境。

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_11670.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单播以及多播的书写实验

实验目的: 学习对每个分类单播的理解以及书写 学习对每个分类多播的理解以及书写 实验说明: 通过此实验练习,可以更好的掌握IPv6地址书写以及分类 实验环境: 两台支持SPSERVICES的IOS的路由器 直通线以及串口线 实…

树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

首先我们要知道,驱动的两大利器:电路图(通过电路图去寻找寄存器)和芯片手册 一、寄存器的介绍 芯片手册第六章的89页,GPIO有41个寄存器,所有访问都是32位的。Description是寄存器的功能描述。GPFSEL0&…

2022年最新《Java八股文面试宝典》全网独一份!(效率最高、知识最新、包含各个技术栈)

今天在脉脉刷到了这么一条消息,现在这个大环境,都后悔学Java了,想转行学前端, 看完很是震惊,据大数据统计,Java的待遇是要好过前端的。小伙伴竟然被卷到想要转行......但是行情这个东西,也不是我…

vue3.x之isRef toRefs isRef readonly 公共数据配置 axios配置 路由配置

isRef toRefs toRef 参数: (源对象 , 源对象属性) 可以用来为源响应式对象上的某个 property 新创建一个 ref。然后,ref 可以被传递,它会保持对其源 property 的响应式连接。 也就是说源响应式对象(toRef的第一个参数) 上的某个 property…

【3D视觉】PointNet解析

您好,各位!今天就基于3D点云数据的分类以及分割模型 : PointNet与PointNet做一个简单的解析,解析部分将结合论文与代码,加上一些我个人微不足道(也不一定对)的见解在里面。 在看PointNet与PointNet之前&am…

第三章实验

实例一print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n") number = int(input("请输入您认为符合条件的数:")) if number%3 == 2 and number%5 == 3 and number%7 == 2:print(number,"符合条件:三三数之剩二,五五数…

GBase 8s是如何实现库中数据安全保障的

随着计算机网络的广泛应用,网上信息的开放性与共享性日益增强,但随之而来的是信息安全问 题愈发严重。数据库是这些数据信息存储的主要场所,因此确保数据库中存储以及存取信息的安 全是确保网络安全的首要问题。为此,需要在通用的…

Nginx在Linux下的安装

✨ Nginx在Linux下的安装安装pcre安装其他的依赖安装Nginx(把压缩包放到opt目录)📃个人主页:不断前进的皮卡丘🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记…

软件测试 git和gitee集成Pycharm 基于Flask的Mock Server服务器

文章目录1 Git1.1 作用1.2 工具1.3 名称解释2 安装git和注册Gitee3 使用Git(1)clone克隆命令(2)初始化(3)查看文件状态(4)文件提交暂存区(5)提交到本地版本库(6)修改文件(7)查看日志(8)跳转到提交的时间截点4 git和gitee集成Pycharm4.1 在Pycharm安装git和连接gitee(1)新建项目…

交互与前端3 前端需求简单梳理

说明 技术的终点是前端 我是从模型/算法作为起点的,顺着工作的需要和自己的兴趣,慢慢的逐步走到了前端。我想现在也是时候把前端搞好了,前端有几个作用: 1 对外可以作为广告。技术最终还是要考虑变现的。2 与外部协同。有很多工作是需要外部…

关于穿越机FPV视频果冻效应的讨论

关于穿越机FPV视频果冻效应的讨论1. 名词定义2. 摄像原理2.1 快门分类2.2 卷帘拍摄3. 产生原因4. 解决方法4.1 振动出处4.2 软件方法(辅助作用)4.3 硬件方法(直接办法)5. F450试验机遇到的问题5.1 现象5.2 测试5.3 减震改善5.4 其他改善5.5 初步结论5.6 改进方向6. 总结7. 参考…

基于ssm的远程家庭健康监测管理系统设计与实现-计算机毕业设计源码+LW文档

开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:…

常用的荧光染料示踪剂 Me-tetrazine-ICG,甲基-四嗪-吲哚菁绿 有哪些特点?

甲基-四嗪-吲哚菁绿是一种荧光染料化合物,四嗪可通过TCO点击化学标记到其它大分子上。吲哚菁绿是生物学中常用的荧光染料示踪剂,波长更长。 西安凯新生物科技有限公司常规修饰性聚乙二醇常备现 货,非常规基团修饰性聚乙二醇(PEG&a…

h5(1)

H5 一、canvas标签 canvas是绘图标签&#xff0c;可以使用该标签在网页上生成一块画布&#xff0c;然后就可以在这块画布中随意的绘图。 canvas标签基本使用&#xff1a; <canvas width"500" height"500" id"cvs"></canvas> //w…

AWS聚焦数字经济与可持续发展

2022年中国国际服务贸易交易会于9月5日圆满闭幕&#xff0c;AWS在此间展示了多项领先的云计算技术和行业解决方案。围绕着本届服贸会“服务合作促发展绿色创新迎未来”的主题&#xff0c;AWS也在此次论坛中诠释和传递着其在助力数字经济及企业可持续发展的价值愿景。 9月3日与…

springboot 上传文件/图片到本地文件夹,利用nginx可以采用地址打开该文件

springboot 上传文件/图片到本地文件夹&#xff0c;利用nginx可以采用地址打开该文件 步骤&#xff1a; 一、下载nginx 打开nginx.conf 文件&#xff0c;配置nginx 启动nginx在nginx.exe文件所在的文件夹路径上直接cmd&#xff0c;输入nginx.exe即可启动nginx 注意&#xff…

企业运营管理 | 如何用「内容」取胜营销战?

全媒体时代&#xff0c;舆论生态、媒体格局、传播方式日新月异&#xff0c;但「内容为王」始终是品牌营销增长的公认规则。 除了投放渠道多、内容更新频次快、跨地域运营等挑战&#xff0c;如何规模化地输出统一的、优质的内容&#xff0c;以此驱动品牌增长&#xff0c;成为品牌…

u盘部分文件无故消失该怎么办?

u盘属于移动存储设备&#xff0c;用于备份数据&#xff0c;方便携带。可以存放各种格式的数据、文档、音频、视频、图片&#xff0c;即插即用&#xff0c;随时拔下。这给了我们极大地便利。但是我们在使用u盘的时候偶尔会出现一些意外&#xff0c;比如u盘文件没删除却消失了&am…

数据分析案例-基于sklearn随机森林算法探究影响预期寿命的因素

目录 项目目标 导入数据 查看数据基本信息 数据预处理 数据可视化 特征工程 建模 项目目标 **探索影响预期寿命的因素** 世卫组织建立了一段时间内所有国家健康状况的数据集&#xff0c;其中包括预期寿命&#xff0c;成人死亡率等方面的统计数据。使用此数据集&#xff…

Panama-FFI实现原理与移植

移植FFI 在说明如何对FFI进行移植之前需要先说明FFI的实现原理。JEP424是外部函数访问+本地内存,但是实际上需要移植的内容只有外部函数访问,对于本地内存的操作并不需要修改。 从java中调用native方法叫做downcall,而从native方法中调用java方法叫做upcall,下面通过downca…