Python 的 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 和下标判断稳得多,也好读得多。
- 点赞
- 收藏
- 关注作者
评论(0)