查看: 114|回复: 3

Python正则表达式字符串处理:re库核心函数与语法详解教程

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
正则表达式(Regular Expression)是字符串处理的一把利器,在Python中通过内置的re库即可调用。它能够快速完成文本匹配、提取、替换等操作,广泛应用于数据清洗、表单验证、日志解析等场景。本文从基础匹配函数讲起,逐步深入到语法规则、贪婪与非贪婪模式、组与或的使用以及预编译与替换,并附带可直接运行的代码示例。

一、核心匹配函数:match、search、findall

re库提供了三个最常用的匹配函数:match()、search()和findall()。

1. match():从字符串起始位置开始匹配,如果开头不符合规则,直接返回None。成功时返回匹配对象,包含起始位置和内容。
  1. import re
  2. message = '张三、李四、王五、赵六'
  3. result = re.match('张三', message)
  4. print(result)  # 匹配成功,输出匹配对象
  5. result = re.match('李四', message)
  6. print(result)  # None,因为'李四'不在开头
复制代码

2. search():扫描整个字符串,返回第一个匹配结果,不限制起始位置。效果类似于在文本中查找。
  1. import re
  2. message = '张三、李四、王五、赵六'
  3. result = re.search('王五', message)
  4. print(result)  # 匹配成功,即使'王五'不在开头
复制代码

3. findall():找出字符串中所有符合规则的子串,以列表形式返回。
  1. import re
  2. message = '张三、李四、王五、赵六、王五'
  3. result = re.findall('王五', message)
  4. print(result)  # ['王五', '王五']
复制代码

二、正则表达式语法规则

1. 字符范围
字符集用方括号表示,可匹配指定范围内的任意单个字符。
  1. import re
  2. message = 'Python93,C87,Java63,C++88'
  3. # 匹配第一个出现的'c'或'n'
  4. print(re.search('[cn]', message))  # 匹配到'P'? 误,实际匹配到'n'
  5. # 提取所有数字
  6. print(re.findall('[0-9]', message))
  7. # 提取由字母后跟数字组成的两位结果
  8. print(re.findall('[cn][0-9]', message))  # 匹配'C8','J6'? 注意大小写
复制代码

2. 匹配次数
常用量词:*(0次或多次)、+(1次或多次)、?(0次或1次)、{n}(恰好n次)、{n,}(至少n次)、{n,m}(n到m次)。它们控制前面元素出现的次数。
  1. import re
  2. message = 'da2a7ddbre77yifed777t3fefd7777b'
  3. # 匹配字母(0次或多次)后紧跟一个数字再跟一个字母
  4. result = re.findall('[a-z]*[0-9][a-z]', message)
  5. print(result)
复制代码

实际应用:手机号、QQ号、用户名验证。
  1. import re
  2. # 手机号:以1开头,后跟10位数字
  3. phone = input('请输入手机号:')
  4. if re.fullmatch('1[0-9]{10}', phone):  # fullmatch要求完全匹配
  5.     print('有效手机号')
  6. else:
  7.     print('无效')
  8. # QQ号:首位1-9,后跟4-10位数字
  9. qq = input('请输入QQ号:')
  10. if re.match('[1-9][0-9]{4,10}$', qq):
  11.     print('有效QQ')
  12. else:
  13.     print('无效')
  14. # 用户名:以字母或下划线开头,后跟至少7个单词字符(字母、数字、下划线)
  15. username = input('请输入用户名:')
  16. if re.match('^[A-Za-z_]\w{7,}$', username):
  17.     print('有效用户名')
  18. else:
  19.     print('无效')
复制代码

3. 特殊字符
\d(数字)、\w(单词字符)、\s(空白)、\b(单词边界)等,能简化常用的匹配模式。
  1. import re
  2. message = 'verb very never every'
  3. # 匹配单词结尾为er但后面不能是单词边界的词(即er在单词中间)
  4. print(re.findall(r'\w+er\B', message))
  5. # 匹配任意字符后跟'e'
  6. print(re.findall('.e', message))
复制代码

三、贪婪与非贪婪模式
默认情况下,量词采用贪婪模式,尽可能匹配更多字符。在量词后加?可切换为非贪婪模式,匹配尽可能少的字符。
  1. import re
  2. message = 'ccc739134792hd'
  3. print(re.findall('ccc\d+', message))   # 贪婪:匹配所有数字
  4. print(re.findall('ccc\d+?', message))  # 非贪婪:只匹配第一个数字'7'
复制代码

四、或(|)与分组(())
| 用于逻辑或,匹配左侧或右侧的表达式。用圆括号可以将部分内容定义为组,组内匹配的内容会被保存,便于后续提取。
  1. import re
  2. message = 'verb very never every'
  3. # 匹配包含'ev'或'ry'的单词
  4. print(re.findall('\w+ev|\w+ry', message))
  5. # 使用分组捕获:取出e后面的字符直至r
  6. print(re.findall('e(.+)(.)r', message))
复制代码

五、替换与预编译

1. sub():替换所有匹配到的内容。
  1. import re
  2. content = 'dh9322hf9f934hfnf39d'
  3. content = re.sub('\d', '0', content)
  4. print(content)  # 所有数字变为0
复制代码

2. compile():当同一个正则表达式需要多次使用时,预编译可提升性能。编译后的模式对象拥有相同的方法(search、findall、sub等)。
  1. import re
  2. datetime_str = '2020 12 15 12:00'
  3. pattern = re.compile('\d{2}:\d{2}')
  4. print(pattern.findall(datetime_str))
复制代码

六、学习建议
正则表达式的语法丰富,不必一开始就记住所有。建议从简单匹配开始,逐步增加复杂度。使用在线工具(如Regex101)调试验证规则,直观看到匹配过程。先分析待匹配文本的规律,再转化为正则表达式。日常多写多练,常用语法自然记牢。

掌握以上内容,已能应对Python字符串处理中的多数正则需求。实际开发中,结合具体场景灵活组合匹配函数与语法规则,能大幅提高文本处理效率。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python正则表达式字符串处理:re库核心函数与语法详解教程

谢谢楼主的详细教程!写得非常清晰,特别是match/search/findall的区别和示例很直观,对新手很友好。我自己也常用正则处理日志数据,感觉预编译那部分确实能提升性能,尤其在循环里。另外想补充一点:如果匹配中文,建议用`re.UNICODE`标志,或者直接用`[\u4e00-\u9fa5]`这样的范围,避免英文字符干扰。不知道楼主有没有遇到过特殊字符需要转义的情况?比如日志里带`.`或`*`的字段,手动加反斜杠容易漏,用`re.escape()`更省事。总之这教程值得收藏,希望以后多分享类似实用技巧!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python正则表达式字符串处理:re库核心函数与语法详解教程

楼主这篇正则教程写得太实用了!从基础函数到语法细节,再到贪婪非贪婪、分组替换,每个点都配了代码示例,特别适合初学者一步步跟着练。我前几天正好在处理日志清洗,用 `findall` 提取数字结果死活不对,看了你讲的字符范围和量词才意识到是贪婪模式的问题,加上 `?` 就搞定了。还有预编译那块,之前写循环时每次都重新 `compile`,后来改成一次编译多次用,速度确实提升不少。建议想进阶的朋友可以再研究下 `(?P...)` 命名分组,配合 `groupdict` 提取数据会非常清晰。总之谢谢分享,收藏了!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python正则表达式字符串处理:re库核心函数与语法详解教程

感谢楼主的详细教程,内容很扎实,从基础函数到进阶语法都有覆盖,例子也直接可运行,对初学者帮助很大。我注意到在字符范围那段代码里,`re.search('', message)` 用了个空字符串,注释却提到匹配到'n',可能是笔误或示例代码没贴完整?另外想请教一下,用 `\b` 匹配单词边界时,如果文本包含中文或者特殊符号,边界规则会生效吗?期待楼主进一步讲解。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-8 12:44 , Processed in 0.029336 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部