正则表达式
理解正则表达式的作用与核心语法
掌握
re模块的常用函数能编写常见场景的正则:手机号、邮箱、身份证、文本提取替换
核心讲解
正则表达式是匹配字符串的强大工具,用特定的符号描述匹配规则,适合文本查找、提取、替换、校验等场景,Python 通过内置 re 模块支持。
(1)常用元字符
.:匹配任意单个字符(除换行符)\d:数字、\w:字母数字下划线、\s:空白字符^:匹配开头、$:匹配结尾*:0 次或多次、+:1 次或多次、?:0 次或 1 次{n}:恰好 n 次、{n,m}:n 到 m 次[]:字符集,匹配其中任意一个,如[a-z]小写字母():分组,提取匹配的部分|:或,匹配左边或右边
(2)贪婪与非贪婪
默认贪婪匹配:
*+尽可能多的匹配非贪婪匹配:加
?,尽可能少匹配,*?+?,提取内容常用
(3)re 模块核心函数
re.match():从开头匹配,匹配到就返回匹配对象,否则 Nonere.search():全文搜索第一个匹配re.findall():全文搜索所有匹配,返回列表re.sub():替换匹配的内容re.split():按正则分割字符串re.compile():编译正则表达式,多次匹配时提升性能
代码示例
import re
# ===== 1. 校验匹配 =====
# 校验手机号
phone = "13812345678"
pattern = r"^1[3-9]\d{9}$"
if re.match(pattern, phone):
print("手机号格式正确")
else:
print("手机号格式错误")
# 校验邮箱
email = "test_123@example.com"
email_pattern = r"^[\w.-]+@[\w.-]+\.\w+$"
print("邮箱校验:", bool(re.match(email_pattern, email)))
# ===== 2. 提取内容 =====
text = "联系电话:13800138000,备用号:15912345678,邮箱:admin@test.cn"
# 提取所有手机号
phones = re.findall(r"1[3-9]\d{9}", text)
print("提取的手机号:", phones)
# 提取邮箱
emails = re.findall(r"[\w.-]+@[\w.-]+\.\w+", text)
print("提取的邮箱:", emails)
# 分组提取
info = "张三,年龄:25岁,城市:成都"
match = re.search(r"(.+?),年龄:(\d+)岁,城市:(.+)", info)
if match:
print("姓名:", match.group(1))
print("年龄:", match.group(2))
print("城市:", match.group(3))
# ===== 3. 替换与分割 =====
# 替换所有数字为*
text2 = "我的手机号是13812345678,身份证号是510101199001011234"
masked = re.sub(r"\d", "*", text2)
print("脱敏后:", masked)
# 按多种分隔符分割
text3 = "苹果,香蕉;橙子 西瓜"
fruits = re.split(r"[,; ]", text3)
print("分割结果:", fruits)
# ===== 4. 编译正则(多次匹配推荐) =====
# 提前编译,提升性能
phone_pattern = re.compile(r"1[3-9]\d{9}")
print(phone_pattern.findall("号码1:13800138000,号码2:15900159000"))
print(phone_pattern.match("13812345678"))
# ===== 5. 非贪婪匹配 =====
html = "<div>标题</div><div>内容</div>"
# 贪婪匹配(默认)
greedy = re.findall(r"<div>(.*)</div>", html)
print("贪婪:", greedy) # ['标题</div><div>内容']
# 非贪婪匹配
non_greedy = re.findall(r"<div>(.*?)</div>", html)
print("非贪婪:", non_greedy) # ['标题', '内容']
常见误区
match 和 search 混淆:match 只匹配开头,search 全文找,校验一般用 match,提取用 search/findall
贪婪匹配问题:提取内容时默认贪婪,会多匹配,加
?改成非贪婪转义问题:匹配
.*等特殊字符要加反斜杠转义\.\*,用原始字符串 r 前缀正则写得太复杂:过于复杂的正则可读性差、难维护,能拆分就拆分
忽略性能:大量循环匹配时,一定要先 compile 编译正则
课后练习
编写正则,校验身份证号(18 位,最后一位可以是 X)
从一段文本中提取所有的 URL 链接
实现:把文本中所有的脏话替换成
***提取 HTML 标签中的文本内容,比如
<p>你好</p>提取出你好

