python3 re模块 Python?re模块的使用全过程 python re
目录
- 一、模块简介
- 二、核心功能
- 三. 功能详解
- 1. re.match(pattern, string, flags=0)
- 2. re.search(pattern, string, flags=0)
- 3. re.compile(pattern, flags=0)
- 4. re.findall(pattern, string, flags=0)
- 5. re.finditer(pattern, string, flags=0)
- 6. re.split(pattern, string, maxsplit=0, flags=0)
- 四、综合应用案例
- 日志分析体系
- 五、正则表达式修饰符 &8211; 可选标志
- 最佳操作建议
- 拓展资料
一、模块简介
re
模块是 Python 标准库中处理正则表达式的核心工具,提供强大的文本模式匹配、搜索和替换功能。通过特定的语法制度,可以快速完成下面内容任务:
- 数据验证(邮箱/手机号格式校验)
- 文本内容提取(日志分析/网页爬虫)
- 批量文本处理(格式转换/敏感词过滤)
- 复杂字符串操作(多条件分割/模板替换)
正则表达式引擎基于 PCRE(Perl Compatible Regular Expressions)实现
二、核心功能
- 函数介绍:
函数名称 | 匹配范围 | 返回类型 | 适用场景 | 性能特点 |
---|---|---|---|---|
re.match | 仅字符串开头 | Match/None | 格式校验 | 快速失败 |
re.search | 全局首次匹配 | Match/None | 内容提取 | 中等性能 |
re.findall | 所有非重叠匹配 | list | 批量数据收集 | 内存消耗高 |
re.finditer | 所有非重叠匹配 | iterator | 大文本处理 | 内存友好 |
re.split | 分割字符串 | list | 复杂分隔符处理 | 替代str.split |
re.compile | &8211; | Pattern对象 | 高频正则表达式复用 | 提升30%性能 |
三. 功能详解
1. re.match(pattern, string, flags=0)
特点
- 仅匹配字符串开头,如果不是起始位置匹配成功的话,
match()
就返回None
。 - 相当于自动添加
^
锚点
参数说明
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大致写,多行匹配等等。参见:正则表达式修饰符 &8211; 可选标志 |
返回值
- 成功:
re.Match
对象,使用group(num)
或groups()
匹配对象函数来获取匹配表达式 - 失败:
None
匹配对象技巧 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
- 使用案例
验证字符串是否以数字开头,调用这个技巧等同于 r’^d+’ 如果匹配的字符串是c123abc,是匹配不到的if re.match(r’d+’, ‘123abc’): print(“Valid header”)else: print(“Invalid header”) 提取开头的版本号version = re.match(r’v?(d+.d+)’, ‘v3.8.1’).group(1) ‘3.8’
2. re.search(pattern, string, flags=0)
特点
- 扫描整个字符串寻找第一个匹配
- 支持复杂定位逻辑
参数与返回:同re.match
使用案例
查找第一个有效数字串,只匹配第一个text = “Total: 1500 items, price $299″match = re.search(r’d+’, text)if match: print(f”价格:match.group()}”) 1500 带条件的搜索pattern = r'(?<=ID:)s*[A-Z0-9]8}’ 查找ID后的8位编码id_code = re.search(pattern, “User ID: AB3XK9P2”).group() AB3XK9P2
3. re.compile(pattern, flags=0)
特点
- 预编译正则表达式,生成一个正则表达式( Pattern )对象
- 适合高频调用场景
参数说明:
pattern
: 一个字符串形式的正则表达式flags
可选,表示匹配模式,比如忽略大致写,多行模式等,具体参数为:re.IGNORECASE
或re.I
&8211; 使匹配对大致写不敏感re.L
表示独特字符集w, W, b, B, s, S
依赖于当前环境re.MULTILINE
或re.M
&8211; 多行模式,改变^
和$
的行为,使它们匹配字符串的每一行的开头和小编觉得。re.DOTALL
或re.S
&8211; 使.
匹配包括换行符在内的任意字符。re.ASCII
&8211; 使w, W, b, B, d, D, s, S
仅匹配ASCII
字符。re.VERBOSE
或re.X
&8211; 忽略空格和注释,可以更清晰地组织复杂的正则表达式。
这些标志可以单独使用,也可以通过按位或(|)
组合使用。例如,re.IGNORECASE | re.MULTILINE
表示同时启用忽略大致写和多行模式。
返回:re.Pattern
对象
使用案例
预编译邮箱验证正则email_re = re.compile( r”'( [w.-]+ 用户名 @ [w.-]+ 域名 . [a-zA-Z]2,4} 顶级域名 )”’, re.VERBOSE) 复用编译对象valid = email_re.match(‘user@example.com’) is not None True
案例调用match
匹配成功时返回一个 Match
对象,其中:
group([group1, …])
技巧用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用group()
或group(0)
;start([group])
技巧用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为0
;end([group])
技巧用于获取分组匹配的子串在整个字符串中的结束位置(子串最终一个字符的索引+1),参数默认值为0
;span([group])
技巧返回(start(group), end(group))
。
4. re.findall(pattern, string, flags=0)
特点:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
^注意: match 和 search 是匹配一次 findall 匹配所有。
参数说明
pattern
匹配模式。string
待匹配的字符串。pos
可选参数,指定字符串的起始位置,默认为 0。endpos
可选参数,指定字符串的结束位置,默认为字符串的长度。
返回值
- 无分组:匹配字符串列表 [‘a’, ‘b’, …]
- 有分组:分组元组列表 [(‘a’, ‘1’), …]
使用案例
提取所有数字numbers = re.findall(r’d+’, ‘A1B23C456’)print(numbers) [‘1′,’23’,’456′] 分组提取日期成分dates = re.findall(r'(d4})-(d2})-(d2})’, ‘2023-08-01, 2025-03-15’)print(dates) [(‘2023′,’08’,’01’), (‘2025′, ’03’, ’15’)]
5. re.finditer(pattern, string, flags=0)
特点
- 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们小编认为一个迭代器返回
- 处理大文本时内存更高效
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大致写,多行匹配等等。参见:正则表达式修饰符 &8211; 可选标志 |
- 返回值:
callable_iterator
对象 - 使用案例
处理100MB日志文件with open(‘server.log’) as f: for match in re.finditer(r’$$(ERROR|WARN)$$.*?(req_id=w+)’, f.read()): level = match.group(1) req_id = match.group(2) print(f”level}报警:req_id}”)
6. re.split(pattern, string, maxsplit=0, flags=0)
特点
- split 技巧按照能够匹配的子串将字符串分割后返回列表
- 保留分割符内容(使用分组时)
参数说明
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
maxsplit | 分割次数,maxsplit=1 分割一次,默认为 0,不限制次数。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大致写,多行匹配等等。参见:正则表达式修饰符 &8211; 可选标志 |
- 使用案例
复杂分隔符分割text = “apple, banana;cherry|orange”parts = re.split(r'[,;|]s*’, text) [‘apple’,’banana’,’cherry’,’orange’] 带保留分隔符的分割re.split(r'([,;])’, ‘a,b;c’) [‘a’, ‘,’, ‘b’, ‘;’, ‘c’] 控制分割次数re.split(r’d+’, ‘a1b22c333d’, maxsplit=2) [‘a’,’b’,’c333d’]
四、综合应用案例
日志分析体系
log_pattern = re.compile(r”’ (?P<time>d4}-d2}-d2}sd2}:d2}:d2}) 时刻 s|s (?P<level>INFO|ERROR|WARN) 日志级别 s|s (?P<module>w+).py 模块 :(?P<line>d+) 行号 s-s (?P<msg>.+) 消息”’, re.VERBOSE)for log in open(‘app.log’): if (match := log_pattern.search(log)): print(f”match.group(‘time’)} [match.group(‘level’)}]”, f”match.group(‘module’)}:match.group(‘line’)}”, match.group(‘msg’))
五、正则表达式修饰符 &8211; 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。
下面内容标志可以单独使用,也可以通过按位或(|)
组合使用。
例如:re.IGNORECASE | re.MULTILINE
表示同时启用忽略大致写和多行模式。
最佳操作建议
- ?优先使用编译对象:当正则使用超过3次时
- ?合理使用分组:避免过多捕获组影响性能
- ?注意贪婪匹配:非贪婪模式
.*?
可避免意外匹配 - ?处理独特字符:用
re.escape()
处理动态输入 - 控制回溯次数:复杂正则可能引发性能难题
完整API文档:Python re模块官方文档
模块 | 功能说明 |
---|---|
用户管理 | 1. 注册登录2. 权限控制3. 资料修改 |
订单体系 |
|
拓展资料
以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。
无论兄弟们可能感兴趣的文章:
- python怎样利用re模块正则表达式匹配ip地址
- Python中re模块下的函数详解
- Python中的re模块之正则表达式模块常用技巧
- python正则表达式re模块的使用示例详解
- 关于Python正则表达式模块之re模块
- 最新python正则表达式(re模块)详解