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

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

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

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 = '''
: # 开始标志
(.*?) #从开始标志的下一个字符开始的任意字符
, #遇到英文逗号就停止
'''

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

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

图片

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

图片

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

图片

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

图片

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

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
| $
)
"""
责任编辑:赵宁宁 来源: 未闻Code
相关推荐

2021-06-15 20:56:39

Python正则表达式

2020-12-17 06:22:57

交互模式代码

2021-04-27 22:15:02

Selenium浏览器爬虫

2022-01-26 07:35:10

爬虫Requestsgzip

2021-10-11 20:02:49

Python父类方法

2021-10-15 21:08:31

PandasExcel对象

2021-04-05 14:47:55

Python多线程事件监控

2022-06-28 09:31:44

LinuxmacOS系统

2022-03-12 20:38:14

网页Python测试

2021-03-18 23:28:45

Python反斜杠字符串

2021-04-12 21:19:01

PythonMakefile项目

2022-06-09 21:34:41

Python代码函数

2018-09-27 15:25:08

正则表达式前端

2010-03-03 10:51:32

正则表达式

2021-07-14 23:54:01

正则表达式数据

2021-03-12 21:19:15

Python链式调用

2021-09-13 20:38:47

Python链式调用

2021-04-19 23:29:44

MakefilemacOSLinux

2023-10-28 12:14:35

爬虫JavaScriptObject

2021-05-10 19:07:18

冗余代码Python
点赞
收藏

51CTO技术栈公众号