正则表达式入门:从匹配到替换的第一课

举报
yd_262156215 发表于 2026/11/06 06:11:03 2026/11/06
【摘要】 正则表达式(Regular Expression,简称正则)是用来描述字符串模式的一套规则。学会它,就能用一行代码完成查找、校验和替换这类重复工作,是每个开发者都值得掌握的基本功。 一、第一个正则:从匹配开始假设要在一段文字里找出所有以 138 开头的 11 位手机号码,逐个比对既慢又容易出错。正则的做法是先写出模式,再让程序按模式去找。在 Python 里可以这样写:import rete...

正则表达式(Regular Expression,简称正则)是用来描述字符串模式的一套规则。学会它,就能用一行代码完成查找、校验和替换这类重复工作,是每个开发者都值得掌握的基本功。

一、第一个正则:从匹配开始

假设要在一段文字里找出所有以 138 开头的 11 位手机号码,逐个比对既慢又容易出错。正则的做法是先写出模式,再让程序按模式去找。

在 Python 里可以这样写:

import re
text = "联系方式:13812345678,备用:13987654321"
print(re.findall(r"138\d{10}", text))

这里 138 是普通字符,\d 表示任意一个数字,{10} 表示前面的内容重复 10 次。运行后会得到 ['13812345678'],这就是正则最直观的用法:描述形状,让机器去匹配。

二、常用元字符,一张表记住

  • .:任意一个字符(换行除外)
  • \d:数字,相当于 [0-9]
  • \w:字母、数字或下划线
  • \s:空白字符,包括空格和换行
  • ^:字符串开头;$:字符串结尾
  • [abc]:方括号内的任意一个字符
  • [^abc]:不在方括号内的任意一个字符

把它们组合起来,^\d{6}$ 就是“恰好 6 位数字”,常用来校验短信验证码;[a-z]+ 则表示“一个或多个小写字母”。

三、量词:控制重复次数

  • *:零次或多次
  • +:一次或多次
  • ?:零次或一次
  • {n}:恰好 n 次
  • {n,m}:n 到 m 次

例如 colou?r 既能匹配 color,也能匹配 colour;\d{4}-\d{2}-\d{2} 可以匹配 2026-11-06 这样的日期。需要注意,* 和 + 默认是贪婪的,会尽量多地匹配,必要时可以在后面加 ? 改为非贪婪,例如 <.*?>。

四、分组与替换:不只是查找

圆括号可以把一部分模式括起来分组,替换时用编号引用。下面这个例子把日期从 2026/11/06 改写成 2026-11-06:

import re
date = "2026/11/06"
print(re.sub(r"(\d{4})/(\d{2})/(\d{2})", r"\1-\2-\3", date))

\1、\2、\3 分别对应三个分组的内容。掌握分组之后,批量整理日志、统一文件名格式都会变得很简单。

五、新手最容易踩的三个坑

第一,忘记转义特殊字符。想匹配真正的点号要写 \.,而不是 .。第二,在 Python 里优先使用原始字符串 r"...",避免反斜杠被先转义一次。第三,不要用正则去解析结构复杂的嵌套文本,例如完整的 HTML,正则适合处理有固定形状的片段,而不是通用解析器。

六、给自己的小练习

试着写三个正则:匹配以字母开头、长度 6 到 16 位的用户名;从一句话里提取所有邮箱地址;把文本里的多个连续空格压缩成一个。写完后用几行 Python 验证,错了就改,改完再测,十分钟就能建立起手感。

正则的语法并不多,关键是多练。从今天的第一个模式开始,下次再遇到“找一类字符串”的任务时,先想想能不能用一行正则解决。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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