1. 模块概述
re
是 python 标准库中用于正则表达式操作的模块,提供字符串的复杂模式匹配、搜索、替换等功能。正则表达式(regex)通过特定语法规则描述字符串模式,适用于文本解析、数据清洗、输入验证等场景。
2. 核心概念
**(1) 正则表达式语法**
- 普通字符:如
a
、1
直接匹配自身。 - 特殊字符:
.
:匹配任意字符(除换行符,除非启用re.dotall
)。^
:匹配字符串开头。$
:匹配字符串结尾。\d
:匹配数字(等价于[0-9]
)。\w
:匹配字母、数字、下划线(等价于[a-za-z0-9_]
)。\s
:匹配空白符(空格、制表符、换行等)。[]
:字符集合(如[a-z]
匹配小写字母)。|
:逻辑或(如a|b
匹配a
或b
)。
- 量词:
*
:匹配前一个字符 0 次或多次。+
:匹配前一个字符 1 次或多次。?
:匹配前一个字符 0 次或 1 次。{m}
:匹配前一个字符恰好m
次。{m,n}
:匹配前一个字符m
到n
次。
- 分组与捕获:
()
:定义捕获组(可通过索引或命名引用)。(?:)
:非捕获组(仅分组,不捕获)。
**(2) 修饰符(flags)**
修饰符 | 描述 |
---|---|
re.ignorecase (或 re.i ) | 忽略大小写 |
re.multiline (或 re.m ) | 多行模式(^ 和 $ 匹配每行的开头/结尾) |
re.dotall (或 re.s ) | . 匹配包括换行符在内的所有字符 |
re.verbose (或 re.x ) | 允许正则表达式换行并添加注释 |
3. 常用函数与示例
**(1) 匹配与搜索**
函数 | 描述 | 示例 |
---|---|---|
re.match(pattern, string) | 从字符串开头匹配模式,成功返回 match 对象,否则返回 none 。 | re.match(r'\d+', '123abc') → match 对象(匹配 '123') |
re.search(pattern, string) | 扫描整个字符串查找第一个匹配,成功返回 match 对象,否则返回 none 。 | re.search(r'\d+', 'abc123def') → match 对象(匹配 '123') |
re.findall(pattern, string) | 返回所有非重叠匹配的列表(直接返回字符串或元组列表)。 | re.findall(r'\d+', 'a1b22c333') → ['1', '22', '333'] |
re.finditer(pattern, string) | 返回所有匹配的迭代器,每个元素是 match 对象。 | [m.group() for m in re.finditer(r'\d+', 'a1b22')] → ['1', '22'] |
示例代码:
import re text = "email: user@example.com, phone: 123-456-7890" # 提取邮箱 email = re.search(r'\w+@\w+\.\w+', text).group() # 'user@example.com' # 提取所有电话号码片段 phones = re.findall(r'\d{3}-\d{3}-\d{4}', text) # ['123-456-7890']
**(2) 替换与分割**
函数 | 描述 | 示例 |
---|---|---|
re.sub(pattern, repl, string) | 将匹配模式的部分替换为 repl ,返回新字符串。 | re.sub(r'\d+', '#', 'a1b22c') → 'a#b#c' |
re.split(pattern, string) | 按模式分割字符串,返回列表。 | re.split(r'\w+', 'hello, world!') → ['hello', 'world', ''] |
示例代码:
# 替换日期格式(yyyy-mm-dd → dd/mm/yyyy) date = "2023-10-05" new_date = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3/\2/\1', date) # '05/10/2023' # 分割复杂文本 text = "apple,,banana;;cherry" parts = re.split(r'[,;]+', text) # ['apple', 'banana', 'cherry']
**(3) 预编译正则表达式**
使用 re.compile()
预编译正则表达式以提高效率(尤其需多次使用同一模式时):
pattern = re.compile(r'\d+') match = pattern.match('123abc') # 等效于 re.match(r'\d+', '123abc')
**(4) 匹配对象(match object)**
成功匹配后返回的 match
对象提供以下方法:
方法 | 描述 |
---|---|
group(n) | 返回第 n 个分组(默认 n=0 表示整个匹配)。 |
groups() | 返回所有分组的元组。 |
start() / end() | 返回匹配的起始/结束索引。 |
span() | 返回匹配的索引范围元组 (start, end) 。 |
示例:
text = "date: 2023-10-05" match = re.search(r'(\d{4})-(\d{2})-(\d{2})', text) if match: print(match.group(0)) # '2023-10-05' print(match.group(1)) # '2023' print(match.groups()) # ('2023', '10', '05') print(match.span(1)) # (6, 10)
4. 高级技巧
**(1) 非贪婪匹配**
默认量词(如 *
, +
)是贪婪的(尽可能多匹配),添加 ?
可改为非贪婪模式:
# 贪婪匹配 re.findall(r'<.*>', '<div>text</div>') # ['<div>text</div>'] # 非贪婪匹配 re.findall(r'<.*?>', '<div>text</div>') # ['<div>', '</div>']
**(2) 命名分组**
使用 (?p<name>...)
定义命名分组,通过 group('name')
访问:
text = "id: 123, name: alice" match = re.search(r'id: (?p<id>\d+), name: (?p<name>\w+)', text) print(match.group('id')) # '123' print(match.group('name')) # 'alice'
5. 常见问题与注意事项
转义字符:在正则表达式中使用
\
需写成\\
,或使用原始字符串r''
简化:python
re.match(r'\d+', '123') # 正确(原始字符串) re.match('\\d+', '123') # 正确(常规字符串需转义)
性能优化:
- 多次使用同一模式时,预编译正则表达式(
re.compile()
)。 - 避免过度复杂的正则表达式(如深层嵌套量词)。
- 多次使用同一模式时,预编译正则表达式(
匹配失败处理:检查
match
对象是否为none
避免异常:python
match = re.search(r'\d+', 'abc') if match: print(match.group())
6. 应用场景
- 数据提取:从日志、html、json 中提取特定字段。
- 输入验证:检查邮箱、电话、密码格式是否合法。
- 文本清洗:替换敏感词、标准化日期格式。
- 复杂搜索:查找符合特定模式的字符串片段。
7. 总结
- 核心功能:
re
模块通过正则表达式实现高效的字符串模式操作。 - 常用函数:
match()
、search()
、findall()
、sub()
、split()
。 - 匹配对象:利用
group()
、groups()
提取分组内容。 - 高级特性:非贪婪匹配、命名分组、预编译优化。
到此这篇关于python正则表达式标准库之re库的文章就介绍到这了,更多相关python re库介绍内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论