Python 的 re:别再手写字符串解析

举报
yd_268445051 发表于 2026/11/13 11:40:02 2026/11/13
【摘要】 Python 的 re:别再手写字符串解析写 Python 时,字符串解析是最容易写散的地方:从一段日志里抠出日期、从文件名里取出编号、判断一串输入是不是邮箱格式。手写 split 加 if 判断,写几行还能应付,规则一多就变成一堆脆弱的下标和分支。re 就是标准库里专门干这件事的工具:用一个模式把规则写清楚,让引擎去匹配,而不是靠手工切片去猜。先看最常见的判断:一个字符串是不是符合某种格...

Python 的 re:别再手写字符串解析

写 Python 时,字符串解析是最容易写散的地方:从一段日志里抠出日期、从文件名里取出编号、判断一串输入是不是邮箱格式。手写 split 加 if 判断,写几行还能应付,规则一多就变成一堆脆弱的下标和分支。re 就是标准库里专门干这件事的工具:用一个模式把规则写清楚,让引擎去匹配,而不是靠手工切片去猜。

先看最常见的判断:一个字符串是不是符合某种格式。

import re

re.match(r"\d{4}-\d{2}-\d{2}", "2026-11-13")

r"\d{4}-\d{2}-\d{2}" 读作“4 位数字、一个短横、2 位数字、一个短横、2 位数字”。\d 代表一位数字,{4} 是重复 4 次。match 只从开头比对,符合就返回一个匹配对象,不符合返回 None——所以判断格式时要记得写 if m is not None,而不是把返回值当布尔值直接用在别处。

第二个顺手的是分组提取。匹配到了还不够,往往要把其中几段取出来用:

m = re.search(r"(\d+)-(\d+)-(\d+)", "日期:2026-11-13")
year, month, day = m.groups()  # ('2026', '11', '13')

括号就是分组,groups() 按顺序把括号里的内容一次取出来。search 和 match 的区别只在起点:search 在整个字符串里找第一处符合的,match 只看开头。日志、文件名这种“目标藏在中间”的场景,用 search 更顺手;校验整串格式时,用 fullmatch 要求从头到尾都符合,比 match 更严。

第三个是替换。把敏感信息或旧格式批量改掉,re.sub 一行就能做:

re.sub(r"\d{4}-\d{2}-\d{2}", "****-**-**", "会议定在 2026-11-13")
# '会议定在 ****-**-**'

第一个参数是模式,第二个是替换成的文本,第三个是原字符串。替换文本里也可以用 \1 引用前面分组的内容,保留原串的一部分、只改另一部分。

最后说两点容易踩的坑。第一,模式前面加 r 写成原始字符串,r"\d" 而不是 "\d",否则反斜杠会被 Python 字符串先转义一次,模式就变了味。第二,同一个模式要反复用时,先 re.compile 编译一次再复用,引擎不用每次重新解析,代码也更清楚:

date_pat = re.compile(r"\d{4}-\d{2}-\d{2}")
date_pat.search("2026-11-13")

正则不是万能的:嵌套结构、HTML 这种层级分明的文本不适合用它硬解析。但在“从一串字符里按规则找东西、取东西、换东西”这个范围内,它比一堆 split 和下标判断稳得多,也好读得多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。