文章目录
- 前言
- 一、正则表达式基础:re 模块三大方法
-
- 1.1 `re.match()`:开头匹配
- 1.2 `re.search()`:查找第一个
- 1.3 `re.findall()`:查找全部
- 1.4 `re.sub()`:替换
- 二、元字符匹配规则
-
- 2.1 单字符匹配
- 2.2 数量匹配
- 2.3 边界匹配
- 2.4 分组与选择
- 2.5 关于`r`前缀
- 三、案例演示
-
- 案例 1:账号校验
- 案例 2:QQ 号校验
- 案例 3:提取 URL 链接
- 案例 4:手机号校验
- 四、进阶优化:预编译正则
- 五、易错点总结
- 六、总结
前言
正则表达式是处理字符串的强大工具,通过特殊的字符序列,可以快速完成字符串的匹配、查找、替换、校验等操作,在爬虫、数据清洗、表单验证等场景中非常常用。本文从 Python 的re模块基础讲起,系统梳理元字符规则,并搭配实战案例,带你快速掌握正则表达式。
一、正则表达式基础:re 模块三大方法
Python 通过内置的re模块使用正则表达式,核心有三个基础匹配方法。
1.1 re.match():开头匹配
从字符串开头进行匹配,开头匹配成功则返回匹配对象,失败返回None。 语法:re.match(匹配规则, 被匹配字符串)
import re
s = "python linux"
result = re.match("python", s)
print(result) # <re.Match object; span=(0, 6), match='python'>
print(result.group()) # 获取匹配到的内容:python
print(result.span()) # 获取匹配下标范围:(0, 6)
注意:只要开头不匹配,即使后面有符合规则的内容,也返回 None。
1.2 re.search():查找第一个
搜索整个字符串,找到第一个匹配项就停止,返回匹配对象;找不到返回 None。
import re
s = "1python 123456python44"
result = re.search("python", s)
print(result) # <re.Match object; span=(1, 7), match='python'>
1.3 re.findall():查找全部
匹配整个字符串,找出所有符合规则的内容,返回列表;找不到返回空列表[]。
import re
s = "1python 123456python44"
result = re.findall("python", s)
print(result) # ['python', 'python']
1.4 re.sub():替换
将字符串中匹配到的内容替换为指定文本,返回替换后的新字符串。 语法:re.sub(匹配规则, 替换内容, 被匹配字符串)
import re
s = "python java python c++"
new_s = re.sub("python", "Python", s)
print(new_s) # Python java Python c++
二、元字符匹配规则
元字符是正则表达式中具有特殊含义的字符,是正则的核心语法。下面分类讲解常用元字符。
2.1 单字符匹配
| . | 匹配任意 1 个字符(除了换行符\\n) |
| [] | 匹配括号内列举的任意一个字符,如[a-z]匹配小写字母 |
| \\d | 匹配数字,等价于[0-9] |
| \\D | 匹配非数字 |
| \\s | 匹配空白字符(空格、tab、换行等) |
| \\S | 匹配非空白字符 |
| \\w | 匹配单词字符(字母、数字、下划线) |
| \\W | 匹配非单词字符 |
注意:\\d默认匹配 Unicode 数字,如需严格匹配 0-9,可加re.ASCII标志或直接写[0-9]。
示例:
import re
s = "python##@@python2!! 666###"
# 找出所有数字
print(re.findall(r"\\d", s)) # ['2', '6', '6', '6']
# 找出所有非单词特殊字符
print(re.findall(r"\\W", s)) # ['#', '#', '@', '@', '!', '!', ' ', ' ', '#', '#', '#']
# 找出所有英文字母
print(re.findall(r"[a-zA-Z]", s)) # ['p', 'y', 't', 'h', 'o', 'n', 'p', 'y', 't', 'h', 'o', 'n']
2.2 数量匹配
控制前面的字符出现的次数:
| * | 匹配前一个字符出现 0 次或多次 |
| + | 匹配前一个字符出现 1 次或多次 |
| ? | 匹配前一个字符出现 0 次或 1 次 |
| {m} | 匹配前一个字符恰好出现 m 次 |
| {m,} | 匹配前一个字符至少出现 m 次 |
| {m,n} | 匹配前一个字符出现 m 到 n 次 |
补充:默认是贪婪匹配(尽可能多匹配),在量词后加?变为非贪婪匹配(尽可能少匹配),如*?、+?、{m,n}?。
2.3 边界匹配
| ^ | 匹配字符串开头 |
| $ | 匹配字符串结尾 |
| \\b | 匹配单词边界 |
| \\B | 匹配非单词边界 |
2.4 分组与选择
| | | 或,匹配左右任意一个表达式 |
| (…) | 将括号内内容作为一个分组,可提取匹配内容 |
| (?:…) | 非捕获分组,只做整体匹配,不单独保存分组内容 |
2.5 关于r前缀
正则表达式中经常出现\\d、\\s等转义字符,在字符串前加r表示原始字符串,可以避免 Python 字符串转义和正则转义的冲突,写正则时建议统一加r前缀。
三、案例演示
案例 1:账号校验
要求:只能由字母和数字组成,长度 6~10 位
import re
account = "aa3456789"
rule = r"^[a-zA-Z0-9]{6,10}$"
result = re.findall(rule, account)
print(result) # 匹配成功返回['aa3456789'],失败返回[]
案例 2:QQ 号校验
要求:纯数字,长度 5-11 位,第一位不能为 0
import re
qq = "2929409481"
rule = r"^[1-9][0-9]{4,10}$"
print(re.findall(rule, qq)) # ['2929409481']
案例 3:提取 URL 链接
import re
text = "配网页地址ssshttps://sc.chinaz.com/tupian/index_1.html配网页地址"
rule = r"https?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\\\(\\\\)]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"
urls = re.findall(rule, text)
print(urls) # ['https://sc.chinaz.com/tupian/index_1.html']
案例 4:手机号校验
要求:11 位数字,1 开头,第二位 3-9
import re
phone = "13812345678"
rule = r"^1[3-9]\\d{9}$"
print(re.match(rule, phone) is not None) # True
四、进阶优化:预编译正则
如果同一个正则规则需要多次使用,用re.compile()预编译,可以提升运行效率:
import re
# 预编译
pattern = re.compile(r"\\d+")
# 多次使用
print(pattern.findall("abc123def456"))
print(pattern.findall("hello789world"))
五、易错点总结
六、总结
- 基础方法:match开头匹配、search找第一个、findall找全部、sub替换
- 元字符四大类:单字符、数量、边界、分组
- 实战核心:搭配^和$做格式校验,用findall做数据提取
- 优化技巧:高频使用的正则用compile预编译,统一使用r前缀避免转义问题
正则表达式语法丰富,入门阶段先掌握以上核心内容,后续可以在实际场景中逐步积累更复杂的用法。
网硕互联帮助中心






评论前必须登录!
注册