更加易读的正则表达式
Python如何写出比较详细易读的正则表达式?
需要借助一个选项: re.VERBOSE
观察如下的三个版本:
第一版本,复杂,不易读,不好改。
# 用来匹配邮箱地址 : first.last@example.com
re.compile('[\w\d.+-]+@([\w\d.]+\.)+(com|org|edu)')
第二版本, 容易读,功能和第一版本相同:
re.compile(
'''
[\w\d.+-]+ # 邮箱前缀
@
([\w\d.]+\.)+ # 域名
(com|org|edu) # 顶级域名
''',
re.VERBOSE)
使用re.VERBOSE 构建正则表达式:
- 用换行分割匹配的各个部分。
- 可以使用注释让正则更加清晰。
- 使用前后项管理、自引用或逻辑的管理更加高级的功能。
高级功能
前向和后向断言。
对某处前边或后边的模式进行预设定,能匹配的是符合模式的内容。(不占用符号)
| 模式 | 含义 |
|---|---|
| (?=pattern) | 肯定前向断言 |
| (?!pattern) | 否定后向断言 |
| (?<!pattern) | 肯定后向断言 |
自引用管理
在模式中匹配前面已经匹配的内容,使用变量引用前面匹配的内容
有num和命名两种方式
| 模式 | 含义 |
|---|---|
| \num | 自引用表达式 做多支持两位99个 |
| (?P=name) | 自引用 指定的一个命名组的值 key-value的形式 |
逻辑判断管理:
(?(id)yes-expression|no-expression) 查看id的组是否匹配 如果匹配就用 yes-expression
来匹配后面的内容 否则 no-expression 来匹配后面的内容。类似if else.
if 的条件是前面某个id是否匹配。
高级功能Demo测试
前向断言:
address = re.compile(
'''
#
((?P<name>
[\w.,]+
)
\s+
)
# 前向管理 肯定前向断言 断言两种形式 包含
(?= (<.*>$) # 包含尖角号
| # 或
([^<].*[^>]$) # 不包含尖角号
)
<? # 前后向断言不消耗符号 这里可选的匹配尖角号
# jie.zhang@example.com>
(?P<email>
[\w\d.+-]+ # 用户名
@
([\w\d.]+\.)+ # 域名
(com|org|edu)
)
>? # 前后向断言不消耗符号 这里可选的匹配尖角号
''',
re.VERBOSE) # re.VERBOSE 构建详细内容的正则表达式
candidates = [
u'张杰 <jie.zhang@example.com>', # 正例
u'周杰伦 jielun.zhou@example.com', # 正例
u'张杰 <jie.zhang@example.com', # 反例
u'周杰伦 jielun.zhou@example.com>', # 反例
]
for candidate in candidates:
print('例子:', candidate)
match = address.search(candidate)

本文介绍如何使用Python的re模块编写易于理解的正则表达式,并通过re.VERBOSE选项来增强可读性。文中提供了多种高级功能示例,包括前向与后向断言、自引用管理和逻辑判断管理等。
最低0.47元/天 解锁文章
564

被折叠的 条评论
为什么被折叠?



