当前位置: 首页 > news >正文

正则表达式学习笔记

一、正则表达式是什么?

正则表达式(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
|逻辑“或”匹配cat|dog → 匹配 catdog

三、正则表达式进阶用法
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 = "user.name+2023@example.com"
 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. 结合实际项目,解决真实问题(如日志解析、数据清洗)。

相关文章:

  • 深入理解Softmax函数及其在PyTorch中的实现
  • 2025华为OD真题目录:全流程解析/备考攻略/经验分享/Java/python/JavaScript/C++/C语言/GO六种语言最佳实现
  • 从零开始学Python游戏编程21-Pygame库1
  • DDoS攻击:网络世界的“洪峰考验”与应对逻辑
  • k8s证书续期
  • HarmonyOS-ArkUI V2装饰器@Local装饰器:组件内部状态
  • 2025年ChatGPT最新功能深度解析:从技术升级到应用场景全面解读
  • Lua 中,`math.random` 的详细用法
  • spring:xml方式调用构造方法创建Bean,调用set方法配置字段
  • 视频智能分析平台EasyCVR打造智能视频监控烟火预警系统,助力烟花鞭炮厂坚固安全防线
  • pyautogui是什么:自动化鼠标和键盘操作
  • Laravel 使用 事件和监听器实现 数据状态变更
  • 5分钟用Docker Desktop新功能搭建Python+AI开发环境
  • docker 运行自定义化的服务-后端
  • 渗透测试实战:使用Hydra破解MySQL弱口令(附合法授权流程+防御方案)
  • Cannot find module ‘vue‘ or its corresponding type declarations
  • 实战教程:使用JetBrians Rider快速部署与调试PS5和Xbox上的UE项目
  • 《Vue Router实战教程》3.动态路由匹配
  • 2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(4卷)任务书
  • 3D激光轮廓仪知识整理
  • 专门做优惠劵的网站/河南网站优化公司哪家好
  • 沈阳谷歌网站建设/学做网站培训班要多少钱
  • 专门做折扣的网站/百度seo快速提升排名
  • php双语网站/经典网络营销案例
  • 西安网站建设 企业建站/凤凰网台湾资讯
  • 河北廊坊建设银行网站/怎么找需要做推广的公司