文章目录
- 前言
- [一、正则表达式基础:re 模块三大方法](#一、正则表达式基础:re 模块三大方法)
-
- [1.1 `re.match()`:开头匹配](#1.1
re.match():开头匹配) - [1.2 `re.search()`:查找第一个](#1.2
re.search():查找第一个) - [1.3 `re.findall()`:查找全部](#1.3
re.findall():查找全部) - [1.4 `re.sub()`:替换](#1.4
re.sub():替换)
- [1.1 `re.match()`:开头匹配](#1.1
- 二、元字符匹配规则
-
- [2.1 单字符匹配](#2.1 单字符匹配)
- [2.2 数量匹配](#2.2 数量匹配)
- [2.3 边界匹配](#2.3 边界匹配)
- [2.4 分组与选择](#2.4 分组与选择)
- [2.5 关于`r`前缀](#2.5 关于
r前缀)
- 三、案例演示
-
- [案例 1:账号校验](#案例 1:账号校验)
- [案例 2:QQ 号校验](#案例 2:QQ 号校验)
- [案例 3:提取 URL 链接](#案例 3:提取 URL 链接)
- [案例 4:手机号校验](#案例 4:手机号校验)
- 四、进阶优化:预编译正则
- 五、易错点总结
- 六、总结
前言
正则表达式是处理字符串的强大工具,通过特殊的字符序列,可以快速完成字符串的匹配、查找、替换、校验 等操作,在爬虫、数据清洗、表单验证等场景中非常常用。本文从 Python 的re模块基础讲起,系统梳理元字符规则,并搭配实战案例,带你快速掌握正则表达式。
一、正则表达式基础:re 模块三大方法
Python 通过内置的re模块使用正则表达式,核心有三个基础匹配方法。
1.1 re.match():开头匹配
从字符串开头 进行匹配,开头匹配成功则返回匹配对象,失败返回None。
语法:re.match(匹配规则, 被匹配字符串)
python
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。
python
import re
s = "1python 123456python44"
result = re.search("python", s)
print(result) # <re.Match object; span=(1, 7), match='python'>
1.3 re.findall():查找全部
匹配整个字符串,找出所有符合规则的内容,返回列表;找不到返回空列表[]。
python
import re
s = "1python 123456python44"
result = re.findall("python", s)
print(result) # ['python', 'python']
1.4 re.sub():替换
将字符串中匹配到的内容替换为指定文本,返回替换后的新字符串。
语法:re.sub(匹配规则, 替换内容, 被匹配字符串)
python
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]。
示例:
python
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 位
python
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
python
import re
qq = "2929409481"
rule = r"^[1-9][0-9]{4,10}$"
print(re.findall(rule, qq)) # ['2929409481']
案例 3:提取 URL 链接
python
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
python
import re
phone = "13812345678"
rule = r"^1[3-9]\d{9}$"
print(re.match(rule, phone) is not None) # True
四、进阶优化:预编译正则
如果同一个正则规则需要多次使用,用re.compile()预编译,可以提升运行效率:
python
import re
# 预编译
pattern = re.compile(r"\d+")
# 多次使用
print(pattern.findall("abc123def456"))
print(pattern.findall("hello789world"))
五、易错点总结
- match 和 search 混淆 :
match只匹配开头,search匹配整个字符串找第一个 - 忘记加 r 前缀:导致转义字符冲突,匹配结果不符合预期
- 贪婪匹配陷阱 :默认贪婪匹配会尽可能多匹配,需要精准匹配时记得加
?转为非贪婪 ^和$的使用:做整体校验时必须加开头和结尾符,否则只要字符串包含符合规则的内容就会匹配成功- 分组提取 :使用
(...)分组后,findall会只返回分组内容,如需返回完整匹配可使用非捕获分组(?:...)
六、总结
- 基础方法:
match开头匹配、search找第一个、findall找全部、sub替换 - 元字符四大类:单字符、数量、边界、分组
- 实战核心:搭配
^和$做格式校验,用findall做数据提取 - 优化技巧:高频使用的正则用
compile预编译,统一使用r前缀避免转义问题
正则表达式语法丰富,入门阶段先掌握以上核心内容,后续可以在实际场景中逐步积累更复杂的用法。