正则表达式学习笔记

一、正则表达式是什么?

正则表达式(Regular Expression,简称 Regex )是一种用于描述字符串匹配规则的工具。通过定义特定的字符模式,可以实现以下功能:

  • 验证字符串是否符合某种格式(如邮箱、手机号)。

  • 提取字符串中的特定部分(如日期、链接)。

  • 替换字符串中的内容(如隐藏敏感信息)。

  • 分割字符串为子串(如按分隔符切割数据)。


二、基本语法规则

正则表达式由普通字符(如字母、数字)和特殊符号(称为 元字符)组成。以下是核心元字符及其功能:

1. 匹配单个字符
符号 功能 示例
. 匹配任意单个字符(除换行符) a.cabca@c
\d 匹配数字(等价于 [0-9] \d05
\w 匹配字母、数字、下划线 \w+user123
\s 匹配空白符(空格、制表符等) \s → (空格)
[ ] 匹配字符集合中的任意一个 [aeiou] → 匹配元音字母
2. 数量限定符
符号 功能 示例
* 前一个字符出现 0次或多次 ab*cacabbc
+ 前一个字符出现 1次或多次 ab+cabcabbbc
? 前一个字符出现 0次或1次 colou?rcolorcolour
{n} 前一个字符恰好出现 n次 a{3}aaa
{n,m} 前一个字符出现 n到m次 a{2,4}aaaaaa
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) → 匹配后面紧跟 10Windows
(?!...) 正向否定断言(后面不是...) Windows(?!7) → 匹配后面不是 7Windows
(?<=...) 反向肯定断言(前面是...) (?<=\$)\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

五、常见应用场景
  1. 数据清洗 去除文本中的无效字符(如特殊符号、多余空格)。

  2. 日志分析 提取日志文件中的时间戳、错误代码、IP地址等关键信息。

  3. 表单验证 检查用户输入的密码复杂度、邮箱格式、手机号合法性。

  4. 爬虫开发 从网页源码中提取链接、图片地址或结构化数据。

六、总结

正则表达式是处理文本数据的"瑞士军刀",掌握其核心规则后,能大幅提升开发效率。学习建议:

  1. 从简单模式开始(如匹配数字、邮箱)。

  2. 多用在线工具调试,理解每一步匹配逻辑。

  3. 结合实际项目,解决真实问题(如日志解析、数据清洗)。

相关推荐
Lounger6613 分钟前
107.二叉树的层序遍历II- 力扣(LeetCode)
python·算法·leetcode
Code_流苏14 分钟前
《Python星球日记》第25天:Pandas 数据分析
python·数据分析·pandas·数据聚合·时间序列
程序员三藏19 分钟前
Selenium三大等待
自动化测试·软件测试·数据库·python·selenium·测试工具·测试用例
美味的大香蕉40 分钟前
Spark Core编程
笔记
明月看潮生44 分钟前
青少年编程与数学 02-016 Python数据结构与算法 14课题、动态规划
python·算法·青少年编程·动态规划·编程与数学
明月看潮生1 小时前
青少年编程与数学 02-016 Python数据结构与算法 11课题、分治
python·算法·青少年编程·编程与数学
liangmou21211 小时前
HTML5的笔记
前端·笔记·html·html5
杂学者1 小时前
python办公自动化---pdf文件的读取、添加水印
python
2401_884810741 小时前
SpringBoot3快速入门笔记
笔记
小学生搞程序1 小时前
学习Python的优势体现在哪些方面?
开发语言·python·学习