Python re
模块常用功能与方法总结
re
模块是 Python 的标准正则表达式库,用于字符串的匹配、查找、替换和分割。以下是其核心功能及常用方法:
一、正则表达式基础语法
符号 | 说明 | 示例 |
---|
. | 匹配任意字符(除换行符) | a.c → abc , a&c |
\d | 匹配数字(等价于 [0-9] ) | \d\d → 42 |
\w | 匹配字母、数字、下划线 | \w+ → user_123 |
\s | 匹配空白字符(空格、制表符等) | a\sb → a b |
[ ] | 匹配括号内的任意字符 | [aeiou] → a , e |
^ | 匹配字符串开头 | ^abc → abc123 (开头) |
$ | 匹配字符串结尾 | xyz$ → 123xyz (结尾) |
* | 匹配前一个字符 0 次或多次 | a*b → b , aaab |
+ | 匹配前一个字符 1 次或多次 | a+b → ab , aaab |
? | 匹配前一个字符 0 次或 1 次 | a?b → b , ab |
{m,n} | 匹配前一个字符 m 到 n 次 | a{2,4}b → aab , aaaab |
` | ` | 或逻辑 |
( ) | 分组捕获 | (abc)+ → abcabc |
二、常用方法
1. 匹配与搜索
方法 | 说明 | 示例 |
---|
re.match() | 从字符串开头匹配模式(返回 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() | 返回所有匹配的迭代器(Match 对象) | for m in re.finditer(r'\d+', 'a1b22'): print(m.group()) |
2. 替换与分割
方法 | 说明 | 示例 |
---|
re.sub() | 替换匹配的子串 | re.sub(r'\d+', 'X', 'a1b2') → aXbX |
re.subn() | 替换并返回替换次数 | re.subn(r'\d+', 'X', 'a1b2') → ('aXbX', 2) |
re.split() | 按模式分割字符串 | re.split(r'\d+', 'a1b22c') → ['a', 'b', 'c'] |
3. 编译正则表达式
pattern = re.compile(r'\d+') # 预编译正则表达式
result = pattern.findall('a1b22c') # ['1', '22']
优势:复用正则对象,提高效率。
三、Match
对象的方法
通过 re.match()
或 re.search()
返回的 Match
对象常用方法:
方法 | 说明 | 示例 |
---|
m.group() | 返回匹配的字符串 | m.group(0) (等价于 m.group() ) |
m.groups() | 返回所有分组的元组 | re.search(r'(\d+)-(\d+)', '123-456').groups() → ('123', '456') |
m.start() | 匹配的起始位置 | m.start() |
m.end() | 匹配的结束位置 | m.end() |
m.span() | 返回 (start, end) 元组 | m.span() |
四、高级功能
1. 分组与命名分组
# 普通分组
m = re.search(r'(\d{4})-(\d{2})', '2023-10')
print(m.groups()) # ('2023', '10')# 命名分组(Python 3.6+)
m = re.search(r'(?P<year>\d{4})-(?P<month>\d{2})', '2023-10')
print(m.group('year')) # '2023'
2. 非贪婪匹配
在 *
或 +
后加 ?
实现最短匹配:
re.search(r'<.*?>', '<a> <b>').group() # '<a>'(非贪婪)
re.search(r'<.*>', '<a> <b>').group() # '<a> <b>'(贪婪)
3. 预搜索断言
语法 | 说明 | 示例 |
---|
(?=...) | 正向肯定预查 | \w+(?=\.) → file (匹配后跟 . 的单词) |
(?!...) | 正向否定预查 | \d{3}(?!\d) → 123 (匹配后不跟数字的3位数) |
(?<=...) | 反向肯定预查 | (?<=\$)\d+ → 100 (匹配 $ 后的数字) |
(?<!...) | 反向否定预查 | (?<!-)\d+ → 123 (匹配前面不是 - 的数字) |
五、实战示例
1. 提取邮箱地址
text = "Contact: user@example.com, support@test.org"
emails = re.findall(r'[\w\.-]+@[\w\.-]+', text)
# ['user@example.com', 'support@test.org']
2. 隐藏手机号中间四位
phone = "13812345678"
hidden = re.sub(r'(\d{3})\d{4}(\d{4})', r'\1****\2', phone)
# '138****5678'
3. 验证密码强度
# 要求:至少8位,包含大小写字母和数字
pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$'
is_valid = bool(re.match(pattern, 'Passw0rd')) # True
六、注意事项
- 转义字符:正则中的
\
需写成 \\
或使用原始字符串 r'\d'
。 - 性能优化:复杂正则建议预编译(
re.compile
)。 - 贪婪匹配:默认贪婪,用
?
改为非贪婪。 - Unicode支持:
\w
能匹配中文(如 "你好"
),但 [a-zA-Z]
不能。
总结
场景 | 推荐方法 |
---|
验证字符串格式 | re.match() 或 re.fullmatch() |
提取内容 | re.findall() 或 re.finditer() |
替换文本 | re.sub() |
复杂正则 | 预编译 re.compile() |
官方文档:Python re 模块