【Python 正则表达式】零基础也能精通的正则表达式学习路线与参考资料

news2024/11/30 2:32:27

在这里插入图片描述

文章目录

    • 一、正则表达式基础
    • 二、进阶知识
    • 三、优秀实践
    • 参考资料:

一、正则表达式基础

正则表达式是一种用来描述字符模式的语言,它可以用来匹配、查找、替换字符串中的文本。在Python中,我们可以使用re模块来操作正则表达式。

  1. 正则表达式基本语法

正则表达式的基本语法如下:

  • 字符:一个字符表示匹配该字符本身
    • 例如,正则表达式"a"可以匹配字符"a",但不能匹配"a1"或"b"
  • 字符集合:用方括号表示一组字符,匹配其中的任意一个字符
    • 例如,正则表达式"[ab]“可以匹配字符"a"或"b”,但不能匹配"a1"
  • 范围表示:用连字符表示范围,匹配其中的任意一个字符
    • 例如,正则表达式"[a-z]“可以匹配任意小写字母,而”[0-9]"可以匹配任意数字
  • 预定义字符集合:用特殊的字符表示一组字符,例如\d表示任意数字,\s表示任意空白字符,\w表示任意字母、数字或下划线等等
  • 量词:表示前面的字符或组合可以出现的次数
    • 例如,正则表达式"a+“可以匹配一个或多个字符"a”,"a*“可以匹配零个或多个字符"a”,“a?“可以匹配零个或一个字符"a”,”{n}“表示匹配恰好n个前面的字符,”{n,m}"表示匹配n到m个前面的字符
  • 或:用|表示或者,匹配符合其中任意一种情况的字符串
    • 例如,正则表达式"ab|cd"可以匹配"ab"或"cd"
  • 分组:用()表示一组字符,其中的内容可以被引用到其他地方
    • 例如,正则表达式"(ab)+“可以匹配"ab”、“abab”、"ababab"等
  1. 使用re模块匹配文本

在Python中,我们可以使用re模块中的findall、search、match等函数来匹配字符串。它们的区别在于findall会返回所有符合条件的结果,而search和match只会返回第一个符合条件的结果。

例如,以下代码可以匹配一个字符串中的所有数字:

``python
import re

text = “hello 123 world 456”
pattern = “\d+”
result = re.findall(pattern, text)
print(result) # [“123”, “456”]
`

  1. 实战练习

以下是几个正则表达式实战练习:

  • 匹配邮箱地址:[\w.]+@\w+.\w+
  • 匹配手机号码:1[3456789]\d{9}
  • 匹配IP地址:(\d{1,3}.){3}\d{1,3}
  • 匹配HTML标签:<([a-z]+)([^<]+)(?:>(.)</\1>|\s+/>)
  • 匹配中文字符:[\u4e00-\u9fa5]

二、进阶知识

  1. 贪婪与非贪婪匹配

默认情况下,正则表达式采用贪婪匹配,即尽可能地匹配更多的字符。例如,正则表达式"\d+“会尽可能匹配到更多的数字字符。如果要采用非贪婪匹配,可以在量词后加上”?“。例如,正则表达式”\d+?"会匹配到最少的数字字符。

  1. 回溯与性能优化

正则表达式的匹配过程中,可能会出现回溯的情况,即尝试匹配失败后,会回溯到之前的位置重新匹配。如果回溯次数太多,就会导致匹配效率低下。为了避免回溯,可以使用一些优化技巧,例如避免使用多重嵌套的括号、避免使用正则表达式中不必要的量词、采用非贪婪匹配等等。

  1. 前向匹配和后向匹配

前向匹配和后向匹配是正则表达式中一些高级的功能。它们可以用来指定一个字符串前面或后面必须满足特定的条件才能进行匹配。例如,可以使用前向匹配来匹配一个字符串前面必须包含特定的字符串,例如"前方高能";可以使用后向匹配来匹配一个字符串后面必须包含特定的字符串,例如"后面的话"。

  1. lookaround

正则表达式中的lookaround功能可以用来实现前向匹配和后向匹配。lookaround其实是一个零宽断言,它不会真正匹配字符串,而只是检查字符串前面或后面是否符合特定的条件。

  • 前向查找:(?<=pattern)表示匹配pattern前面的字符串,但不包括pattern本身
  • 前向否定查找:(?<!pattern)表示匹配不在pattern前面的字符串
  • 后向查找:(?=pattern)表示匹配pattern后面的字符串,但不包括pattern本身
  • 后向否定查找:(?!pattern)表示匹配不在pattern后面的字符串

例如,以下代码可以通过前向否定查找和后向否定查找来匹配一个字符串中除了特定字符串外的所有字符:

import re

text = "hello world, this is a test"
pattern = "(?<!test).(?<!this).(?<!world),(?!test)(?!this)(?!world).*(?<!test).(?<!this).(?<!world)"
result = re.findall(pattern, text)
print(result)  # [" ", "a", " ", "t", "e", "s", "t"]

三、优秀实践

  1. 提前编译正则表达式

在进行大量正则表达式匹配的时候,可以考虑将正则表达式编译为一个re.Pattern对象,这样可以避免重复编译造成的性能损失。例如,以下代码将一个正则表达式编译为一个re.Pattern对象:

import re

pattern = re.compile("\d+")
result = pattern.findall("hello 123 world 456")
  1. 合理使用正则表达式

在使用正则表达式的时候,要根据具体的问题来选择合适的表达式,避免表达式过于复杂,导致性能下降或匹配出的结果不准确。同时,可以使用一些工具来辅助编写正则表达式,例如Online Regex Tester、RegexBuddy等。

  1. 小心特殊字符转义

在使用正则表达式的时候,要注意对特殊字符进行转义,例如".“、”*“、”+“等。同时,要注意Python中的字符串转义字符与正则表达式中的转义字符的差异,正确地使用转义字符可以避免匹配出错误的结果。例如,以下代码会匹配到”😕/example.com",而不是"http://example.com",因为"."被解释为任意字符:

import re

text = "http://example.com"
pattern = "http://.*\.com"
result = re.findall(pattern, text)
print(result)  # ["://example.com"]

正确的写法应该将".“转义为”.",例如:

import re

text = "http://example.com"
pattern = "http://.*\\.com"
result = re.findall(pattern, text)
print(result)  # ["http://example.com"]

参考资料:

  1. Python re模块官方文档:https://docs.python.org/zh-cn/3/library/re.html
  2. Python正则表达式教程:https://www.runoob.com/regexp/regexp-syntax.html
  3. 正则表达式30分钟入门教程:https://deerchao.cn/tutorials/regex/regex.htm
  4. 实用的正则表达式收集:https://regex101.com/
  5. Python Regular Expressions Cheat Sheet:https://www.debuggex.com/cheatsheet/regex/python

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB三维曲面作图(三)特殊效果的绘图(灯光)

首先&#xff0c;我们来绘制一个海螺的复杂图形 close all t linspace(0,2*pi,512); [u v] meshgrid(t); a -0.4; b 0.5; c 0.1; n 3; x (a*(1-v/(2*pi)).*(1cos(u))c).*cos(n*v); y (a*(1-v/(2*pi)).*(1cos(u))c).*sin(n*v); z b*v/(2*pi)a*(1-v/(2*pi)).*sin(u); s…

RabbitMQ详解(五):过期时间TTL、死信队列、磁盘监控

过期时间TTL&#xff08;Time To Live&#xff09; 过期时间TTL表示可以对消息设置预期的时间&#xff0c;在这个时间内都可以被消费者接收获取&#xff1b;过了之后消息将自动被删除。 目前有两种方法可以设置 第一种方法是通过队列属性设置&#xff0c;队列中所有消息都有…

App报毒-Google Play保护机制,已屏蔽不安全的应用

一、概述 解决安卓app在海外国际版本如&#xff1a;华为、OPP/VIVO、小米和荣耀报毒问题.触发Google Play保护机制. 安卓app报毒爆红&#xff0c;vivo手机爆红&#xff0c;oppo小米华为荣耀手机报毒&#xff0c;手机安装app时提示报毒&#xff0c;有的app是刚打包出来、有的是用…

Cocos Creator 3.7.3 正式上线,渲染管线和算法持续更新

Cocos Creator 3.7.3 正式发布。该版本对近日用户反馈的一系列关键性问题进行了集中修复&#xff0c;也对一部分性能进行了优化&#xff0c;提升了用户体验&#xff0c;建议所有 v3.x 用户升级。 Engine Features Render Graph 自定义渲染管线支持 GLES 后端Deprecate addRast…

【C++】五一假期,我学会了C++类和对象 ( 看完这篇你也能学会 ~ )

文章目录 ☑️前言✅类和对象【&#x1f3c6;上篇&#x1f3c6;】一. 面向过程和面向对象初步认识二. 与类的完美邂逅❤️1. 类的引入2. 类的定义 三. 增进与类的距离❤️1. 类的访问限定符及封装1.1. 访问限定符1.2. 封装【⭐重大思想⭐】 2. 类的作用域3. 类的实例化 四. 类对…

专访惠众科技|元宇宙应用如何借助3DCAT实时云渲染实现流畅大并发呈现?

当前互联网流量红利已经逐渐消失&#xff0c;营销同质化愈发严重。在这样的背景下&#xff0c;催生了以为元宇宙 焦点的虚拟产业经济。元宇宙在各行各业中以不同形式快速萌生、成长&#xff0c;呈现出多元化的应用场景。尤其是众多品牌&#xff0c;将元宇宙视为品牌建设与营销新…

JavaScript - 进阶+高级(笔记)

前言 给孩子点点关注吧&#xff01;&#x1f62d; 本篇文章主要记录以下几部分&#xff1a; 进阶&#xff1a; 作用域&#xff1b;函数进阶&#xff08;函数提升、函数参数、箭头函数&#xff09;&#xff1b;解构赋值&#xff1b;对象进阶&#xff08;构造函数、实例成员、静…

算法记录 | Day57 动态规划

647.回文子串 思路&#xff1a; 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a; 布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是dp[i][j]为true&#xff0c;否…

【前端】实际开发案例

文章目录 1. 侧边栏2. 调查报告3. 显示隐藏遮罩案列4. 鼠标经过&#xff0c;图片放大5. 奔跑的熊6. 旋转木马7. 百度换肤8. tab栏切换9. 下拉菜单10. 发布留言11. 动态生成表格12. 图片跟随鼠标移动13. 按键输入内容14. 定时器实现15. 发送短信16. 5秒后跳转页面17. 获取URL参数…

Ajax + axios + 常用状态码(笔记)

Ajax 求关注&#x1f62d; 一、客户端与服务器相关的概念 1.1 客户端与服务器 1.1.1 服务器 服务器&#xff1a; 负责 存放 和 对外提供 资源 的 电脑本质&#xff1a; 就是一台电脑&#xff0c;只不过 性能 要比别的电脑 高 1.1.2 客户端 客户端&#xff1a; 在上网过程…

【HttpRunner3】一分钟生成测试用例

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍HttpRunner概念、设计思想和理念、环境搭建、一分钟生成测试用例和脚手架快速创建。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上…

成都爱尔李晓峰主任:眼睛干到发出求救信号,快注意!

眼睛总感觉痒痒的&#xff0c;时不时干涩、酸胀、畏光? 它在提醒你&#xff0c;它太干了救救它! 干眼如何判断&#xff1f; 干眼症是由于泪液的质和量异常或者泪液的流体动力学障碍而导致眼表无法保持湿润的一种眼病。会发生眼睛干涩、酸胀、畏光、灼热感、异物感、看东西容易…

Packet Tracer 模拟配置AAA认证

Packet Tracer 模拟配置AAA认证 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 F0/0 172.16.10.1 255.255.255.0 不适用 S0/3/0 10.1.1.1 255.255.255.0 不适用 F0/1 192.168.1.1 255.255.255.0 不适用 R2 F0/0 192.168.2.1 255.255.255.0 …

【云原生】--- Kubernetes原理

Kubernetes原理 一、Kubernets是什么&#xff1f;1、K8s由来2、K8S的作用 二、为什么需要Kubernetes&#xff0c;它能做什么&#xff1f;三、Kubernetes的特性四、Kubernetes架构1、Kubernetes工作流程2、创建pod流程 一、Kubernets是什么&#xff1f; Kubernetes的缩写为&…

Aztec 征求 Rollup Sequencer去中心化提案

1. 引言 前序博客&#xff1a; Rollup去中心化Rollup Decentralization Aztec Rollup中Sequencer角色的主要职责为&#xff1a; 1&#xff09;从mempool中选取pending交易2&#xff09;将选中的pending交易排序打包到L2区块中3&#xff09;验证所有private交易proof以检查其…

(c语言1)阶乘求和

输入格式 求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字(n不超过20)。 输入格式 n 输出格式 Sn的值 样例输入 5 样例输出 153 题解 然后直接先上题解 #include<stdio.h> int main() {int n,a1;long long sum0,m1; //为这是阶乘求和&#xff0c;一般的i…

第五十三章 Unity 移动平台输入(上)

在移动设备上&#xff0c;Input 类提供对触摸屏、加速度计和地理/位置输入的访问。这里我们简单介绍Input类对于触摸屏的支持。Input.Touches是一个触摸数组&#xff0c;每个数组元素代表着手指在屏幕上的触碰状态Input.Touch。Input.Touch 数据结构表示&#xff1a; fingerId…

带你了解新兴安全技术

随着科技的不断发展&#xff0c;生物识别技术已经成为了一种重要的安全技术。生物识别技术可以通过对个人身份的验证和认证来防止身份盗窃和其他形式的安全威胁&#xff0c;因此越来越多的组织和企业开始使用这种技术来提高安全性。随着科技的不断发展&#xff0c;生物识别技术…

CTFHub-Git泄露-Log

前言 git是一个版本控制工具&#xff0c;通过泄露的.git文件可还原代码 题目如下 wp 1. dirsearch目录扫描 发现存在git泄露&#xff0c;根据提示下载对应git利用工具GitHack&#xff0c;这个工具的特点是能还原历史版本 2. 使用工具下载源码 tips: 最好在linux中操作&…

springboot社区物业管理系统

分享一个springboot社区物业管理系统&#xff0c;需要的私信 项目简介 本系统涉及到的技术主要如下 推荐环境配置&#xff1a;eclipse/idea jdk1.8 maven mysq 前端技术&#xff1a;Layui&#xff0c;Ajax&#xff0c;Json 后端技术&#xff1a;SpringBoot 2.3.0&#xff0c;…