一、正则表达式是什么?
正则表达式(Regular Expression,简称 Regex )是一种用于描述字符串匹配规则的工具。通过定义特定的字符模式,可以实现以下功能:
-
✅ 验证字符串是否符合某种格式(如邮箱、手机号)。
-
✅ 提取字符串中的特定部分(如日期、链接)。
-
✅ 替换字符串中的内容(如隐藏敏感信息)。
-
✅ 分割字符串为子串(如按分隔符切割数据)。
二、基本语法规则
正则表达式由普通字符(如字母、数字)和特殊符号(称为 元字符)组成。以下是核心元字符及其功能:
1. 匹配单个字符
符号 | 功能 | 示例 |
---|---|---|
. |
匹配任意单个字符(除换行符) | a.c → abc 、a@c |
\d |
匹配数字(等价于 [0-9] ) |
\d → 0 、5 |
\w |
匹配字母、数字、下划线 | \w+ → user123 |
\s |
匹配空白符(空格、制表符等) | \s → (空格) |
[ ] |
匹配字符集合中的任意一个 | [aeiou] → 匹配元音字母 |
2. 数量限定符
符号 | 功能 | 示例 |
---|---|---|
* |
前一个字符出现 0次或多次 | ab*c → ac 、abbc |
+ |
前一个字符出现 1次或多次 | ab+c → abc 、abbbc |
? |
前一个字符出现 0次或1次 | colou?r → color 、colour |
{n} |
前一个字符恰好出现 n次 | a{3} → aaa |
{n,m} |
前一个字符出现 n到m次 | a{2,4} → aa 、aaaa |
3. 位置锚点
符号 | 功能 | 示例 |
---|---|---|
^ |
匹配字符串的开头 | ^abc → 匹配以 abc 开头的字符串 |
$ |
匹配字符串的结尾 | com$ → 匹配以 com 结尾的字符串 |
4. 分组与捕获
符号 | 功能 | 示例 |
---|---|---|
( ) |
将多个字符视为一个整体,并捕获内容 | (\d{3})-(\d{4}) → 匹配 123-4567 ,分组1为 123 ,分组2为 4567 |
(?: ) |
分组但不捕获(非捕获组) | (?:\d{3})-(\d{4}) → 分组1为 4567 |
` | ` | 逻辑"或"匹配 |
三、正则表达式进阶用法
1. 贪婪与非贪婪匹配
-
贪婪模式 :默认匹配尽可能多的字符。 示例:
a.*b
匹配aabb
中的整个字符串。 -
非贪婪模式 :在限定符后加
?
,匹配尽可能少的字符。 示例:a.*?b
匹配aabb
中的aab
。
2. 零宽断言(Lookaround)
语法 | 功能 | 示例 |
---|---|---|
(?=...) |
正向肯定断言(后面是...) | Windows(?=10) → 匹配后面紧跟 10 的 Windows |
(?!...) |
正向否定断言(后面不是...) | Windows(?!7) → 匹配后面不是 7 的 Windows |
(?<=...) |
反向肯定断言(前面是...) | (?<=\$)\d+ → 匹配 $100 中的 100 |
`(? | 反向否定断言(前面不是...) | (? → 匹配 €200中的 200` |
3. 常用预定义字符集
简写 | 等价写法 | 说明 |
---|---|---|
\d |
[0-9] |
数字 |
\D |
[^0-9] |
非数字 |
\w |
[a-zA-Z0-9_] |
单词字符(字母、数字、下划线) |
\W |
[^\w] |
非单词字符 |
\s |
[ \t\n\r\f\v] |
空白符 |
\S |
[^\s] |
非空白符 |
四、Python 的 re
模块实战
1. 常用函数
函数 | 功能 | 示例 |
---|---|---|
re.match() |
从字符串开头匹配模式 | re.match(r'\d+', '123abc') → 匹配 123 |
re.search() |
扫描整个字符串,返回第一个匹配项 | re.search(r'\d+', 'abc123') → 匹配 123 |
re.findall() |
返回所有匹配项的列表 | re.findall(r'\d+', 'a1b22c333') → ['1', '22', '333'] |
re.finditer() |
返回所有匹配项的迭代器(适合大文本处理) | for match in re.finditer(r'\d+', text): ... |
re.sub() |
替换匹配项 | re.sub(r'\d', '*', 'a1b2') → a*b* |
re.split() |
按模式分割字符串 | re.split(r'\W+', 'apple,banana;grape') → ['apple', 'banana', 'grape'] |
2. 匹配对象(Match Object)
-
group()
:返回匹配的字符串。 示例:match.group(1)
获取第一个分组内容。 -
start()
/end()
:返回匹配的起始和结束位置。 -
span()
:返回匹配的 (start, end) 元组。
3. 代码示例
python
import re
# 示例1:验证邮箱格式
email = "[email protected]"
pattern = r'^[\w\.+-]+@[\w-]+\.[a-zA-Z]{2,}$'
is_valid = re.match(pattern, email) is not None
print(is_valid) # True
# 示例2:提取手机号
text = "紧急联系人:138-1234-5678,备用:13987654321"
phones = re.findall(r'\b1[3-9]\d{9}\b', text)
print(phones) # ['13812345678', '13987654321']
# 示例3:替换敏感信息
log = "Error: 2023-08-15 14:30, IP=192.168.1.1, User=admin"
masked_log = re.sub(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', '[IP MASKED]', log)
print(masked_log) # Error: 2023-08-15 14:30, IP=[IP MASKED], User=admin
五、常见应用场景
-
数据清洗 去除文本中的无效字符(如特殊符号、多余空格)。
-
日志分析 提取日志文件中的时间戳、错误代码、IP地址等关键信息。
-
表单验证 检查用户输入的密码复杂度、邮箱格式、手机号合法性。
-
爬虫开发 从网页源码中提取链接、图片地址或结构化数据。
六、总结
正则表达式是处理文本数据的"瑞士军刀",掌握其核心规则后,能大幅提升开发效率。学习建议:
-
从简单模式开始(如匹配数字、邮箱)。
-
多用在线工具调试,理解每一步匹配逻辑。
-
结合实际项目,解决真实问题(如日志解析、数据清洗)。