一日一技:让你的正则表达式可读性提高一百倍

简介: 一日一技:让你的正则表达式可读性提高一百倍

正则表达式这个东西,强大是强大,但写出来跟个表情符号一样。自己写的表达式,过一个月来看,自己都不记得是什么意思了。比如下面这个:


pattern = r"((?:\(\s*)?[A-Z]*H\d+[a-z]*(?:\s*\+\s*[A-Z]*H\d+[a-z]*)*(?:\s*[\):+])?)(.*?)(?=(?:\(\s*)?[A-Z]*H\d+[a-z]*(?:\s*\+\s*[A-Z]*H\d+[a-z]*)*(?:\s*[\):+])?(?![^\w\s])|$)"


有没有什么办法提高正则表达式的可读性呢?我们知道,提高代码可读性的方法之一就是写注释,那么正则表达式能不能写注释呢?


例如对于下面这个句子:


msg = '我叫青南,我的密码是:123kingname456,请注意保密。'


我要提取其中的密码123kingname456,那么我的正则表达式可能是这样的:


pattern = ':(.*?),'


我能不能把它写成这样:


pattern = '''
:  # 开始标志
(.*?)  #从开始标志的下一个字符开始的任意字符
,  #遇到英文逗号就停止
'''


这样写就清晰多了,每个部分是什么作用全都清清楚楚。


但显然直接使用肯定什么都提取不到,如下图所示:


1.png


但我今天在逛Python正则表达式文档[1]的时候,发现了一个好东西:


2.png


使用它,可以让你的正则表达式拥有注释,如下图所示:


3.png


re.VERBOSE也可以简称为re.X,如下图所示:


4.png


本文最开头的复杂正则表达式,使用了注释以后,就会变得更可读:


pattern = r"""
(                       # code (capture)
    # BEGIN multicode
    (?: \( \s* )?       # maybe open paren and maybe space
    # code
    [A-Z]*H  # prefix
    \d+      # digits
    [a-z]*   # suffix
    (?:                 # maybe followed by other codes,
        \s* \+ \s*      # ... plus-separated
        # code
        [A-Z]*H  # prefix
        \d+      # digits
        [a-z]*   # suffix
    )*
    (?: \s* [\):+] )?   # maybe space and maybe close paren or colon or plus
    # END multicode
)
( .*? )                 # message (capture): everything ...
(?=                     # ... up to (but excluding) ...
    # ... the next code
    # BEGIN multicode
    (?: \( \s* )?       # maybe open paren and maybe space
    # code
    [A-Z]*H  # prefix
    \d+      # digits
    [a-z]*   # suffix
    (?:                 # maybe followed by other codes,
        \s* \+ \s*      # ... plus-separated
        # code
        [A-Z]*H  # prefix
        \d+      # digits
        [a-z]*   # suffix
    )*
    (?: \s* [\):+] )?   # maybe space and maybe close paren or colon or plus
    # END multicode
        # (but not when followed by punctuation)
        (?! [^\w\s] )
    # ... or the end
    | $
)
"""


参考资料


[1] 正则表达式文档: https://docs.python.org/3/library/re.html#re.VERBOSE



请关注微信公众号【未闻Code】获取更多精彩文章。

目录
相关文章
|
定位技术 开发工具 图形学
|
分布式计算 Serverless 调度
EMR Serverless Spark:结合实时计算 Flink 基于 Paimon 实现流批一体
本文演示了使用实时计算 Flink 版和 Serverless Spark 产品快速构建 Paimon 数据湖分析的流程,包括数据入湖 OSS、交互式查询,以及离线Compact。Serverless Spark完全兼容Paimon,通过内置的DLF的元数据实现了和其余云产品如实时计算Flink版的元数据互通,形成了完整的流批一体的解决方案。同时支持灵活的作业运行方式和参数配置,能够满足实时分析、生产调度等多项需求。
61075 107
|
机器学习/深度学习 SQL 人工智能
机器学习PAI常见问题之训练模型报错如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
Oracle 关系型数据库 数据库
关系型数据库Oracle执行RMAN脚本
【7月更文挑战第22天】
314 2
|
域名解析 网络协议 Linux
Linux DNS服务详解——DNS服务搭建细节
Linux DNS服务详解——DNS服务搭建细节
253 5
|
存储 Rust 索引
Rust 笔记:Rust 语言中的运算符
Rust 笔记:Rust 语言中的运算符
355 0
|
SQL 数据库 HIVE
python链接hive数据库实现增删改查操作
python链接hive数据库实现增删改查操作
538 0
|
XML 数据可视化 数据格式
【数据集显示标注】VOC文件结构+数据集标注可视化+代码实现
【数据集显示标注】VOC文件结构+数据集标注可视化+代码实现
683 0
|
安全 数据可视化 关系型数据库
测试N次,阿里云centos7安装mysql5.7,看完这篇一次过!
最近闲来无事,买了一个阿里云的服务器,想部署一下自己的项目,于是就开始了艰难的阿里云部署之旅,最开始尝试了很多的CSDN和博客园的文章,很多都以失败告终,最终在不断的试错和热心网友的解释,终于装成功了,特发一篇博客记录一下。这里选择的是在线安装,5.7版本的。
770 2