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

Python基础语法入门(第二十三天)——正则表达式

正则表达式是一种文本模式,用于匹配字符串,它是由字符和特殊字符组成的模式。正则表达式可以用于验证、搜索、替换和提取字符串。其能够应用于各种编程语言和文本处理工具中,如Python、Java、JavaScript等。

正则表达式在线测试工具:https://c.runoob.com/front-end/854/

普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。通常情况下普通字符是直接匹配与其相同的字符。如下图:

在这里插入图片描述

此处就是从待匹配文本中查找abc这个字符串,注意必须是与abc完全匹配才会出现结果。

非打印字符

非打印字符是指在文本中无法直接显示的特殊字符,也称为控制字符或不可见字符。这些字符通常不会在屏幕上显示出来,但它们在计算机系统中起到了各种重要的作用。

字符描述
\cx匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。

如下图匹配换行符\n

在这里插入图片描述

特殊字符(元字符)

特殊字符就是有一些特殊含义的字符,例如*、\、+等在这些特殊字符中,如果待匹配文本中出现了与其相同的字符需要匹配的话就需要使这些特殊字符转义,否则它们只会表达自己特殊的含义。正则中的特殊字符有如下表所示。

描述特殊字符
^匹配输入字符串的开始位置。
$匹配输入字符串的结束位置。
.匹配除换行符外的任意单个字符。
*匹配前面的元素零次或多次。
+匹配前面的元素一次或多次。
?匹配前面的元素零次或一次。
|用于分隔多个模式,匹配其中之一。
[]定义字符类,匹配其中包含的任意一个字符。
[^]定义反向字符类,匹配不在其中的任意一个字符。
()用于分组和捕获匹配的内容。
\用于转义特殊字符,使其成为普通字符。
{n}匹配前面的元素恰好 n 次。
{n,}匹配前面的元素至少 n 次。
{n,m}匹配前面的元素至少 n 次,但不超过 m 次。

以下是一些示例,展示了正则表达式中特殊字符的用法和功能(过多规则就不再贴图展示了,大家自行在测试工具测试):

使用^和$匹配完整的字符串(表示能够匹配到的字符串必须以abc开头结尾):- 正则表达式:^abc$
- 匹配的字符串:abc
- 不匹配的字符串:abcd、aabc使用.匹配除换行符外的任意单个字符:- 正则表达式:a.b
- 匹配的字符串:abb、a_b、axb
- 不匹配的字符串:ab、acdb使用*匹配前面的元素零次或多次:- 正则表达式:a*b
- 匹配的字符串:b、ab、aab、aaab
- 不匹配的字符串:acdb使用+匹配前面的元素一次或多次:- 正则表达式:a+b
- 匹配的字符串:ab、aab、aaab
- 不匹配的字符串:b、acdb使用?匹配前面的元素零次或一次:- 正则表达式:a?b
- 匹配的字符串:b、ab
- 不匹配的字符串:aab、aaab使用|分隔多个模式,匹配其中之一:- 正则表达式:cat|dog
- 匹配的字符串:cat、dog
- 不匹配的字符串:bat、dot使用[]定义字符类,在其中匹配任意一个字符:- 正则表达式:[aeiou]
- 匹配的字符串:a、e、i、o、u
- 不匹配的字符串:b、c、d、f使用[^]定义反向字符类,在其中匹配不在其中的任意一个字符:- 正则表达式:[^aeiou]
- 匹配的字符串:b、c、d、f
- 不匹配的字符串:a、e、i、o、u使用()进行分组和捕获匹配的内容:- 正则表达式:(abc)+
- 匹配的字符串:abc、abcabc、abcabcabc
- 不匹配的字符串:ab、abcc使用\进行特殊字符的转义:- 正则表达式:a\.b
- 匹配的字符串:a.b
- 不匹配的字符串:ab、acb使用{n}、{n,}和{n,m}指定匹配次数的范围:- 正则表达式:a{3}
- 匹配的字符串:aaa
- 不匹配的字符串:aa、aaaa

这些示例展示了正则表达式中特殊字符的一些常见用法和功能,但实际上正则表达式在不同的情境下还有更多的用法和功能。具体的正则表达式语法和用法会因不同的编程语言和正则表达式引擎而有所差异,所以在实际应用中,需要对具体的环境和工具进行了解和调整。

定位符

正则表达式的定位符(Anchors)用于匹配字符串的位置,而不是匹配具体的字符。常见的定位符有以下几种:

^:表示匹配字符串的开始位置。例如,正则表达式"^abc"可以匹配以"abc"开头的字符串。$:表示匹配字符串的结束位置。例如,正则表达式"abc$"可以匹配以"abc"结尾的字符串。\b:表示匹配一个单词边界,即单词的开始或结束位置。一个单词由字母、数字、下划线组成。例如,正则表达式"\bcat\b"可以匹配单独的单词"cat"。\B:表示匹配一个非单词边界,即不是单词的开始或结束位置。例如,正则表达式"\Bcat\B"可以匹配"cat"不在单词边界处的情况。

注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。

若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。不要将 ^ 的这种用法与中括号表达式内的用法混淆。

若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符。

修饰符

修饰符(Modifiers)用于修饰正则表达式的匹配规则,改变匹配的行为。不同的编程语言和正则表达式引擎支持不同的修饰符,下面是一些常见的修饰符:

i:忽略大小写。使得正则表达式不区分大小写。例如,正则表达式"abc"匹配"abc"、"AbC"、"aBC"等。g:全局匹配。使得正则表达式匹配字符串的所有可能。例如,正则表达式"cat"在字符串"cat catcher"中使用全局修饰符可以匹配到两个"cat"。m:多行匹配。使得正则表达式的"^"和"$"修饰符可以分别匹配一行的开头和结尾。例如,正则表达式"^cat$"将匹配"cat"单独一行的情况。s:单行匹配。使得正则表达式的"."可以匹配任意字符,包括换行符。默认情况下,"."匹配除换行符以外的任意字符。x:忽略空白符。使得正则表达式中的空格、制表符等空白符会被忽略,以便更清晰地书写复杂的正则表达式。

需要注意的是,修饰符通常通过特定的语法或方法来应用于正则表达式。具体使用时,需要查阅对应语言或工具的文档以了解正确的修饰符使用方式。

请看一些基本示例

以下是一些示例,演示如何使用修饰符来修改正则表达式的匹配行为:1. 使用修饰符 i 忽略大小写匹配:正则表达式:/cat/i匹配字符串:"cat", "Cat", "CAT" 等。2. 使用修饰符 g 进行全局匹配:正则表达式:/cat/g匹配字符串:"cat cat cat",会找到所有的 "cat"。3. 使用修饰符 m 进行多行匹配:正则表达式:/^cat$/m匹配字符串:
```
cat
cat
cat
```
会匹配每一行的 "cat"。4. 使用修饰符 s 进行单行匹配:正则表达式:/a.b/s匹配字符串:"a\nb",会将 "\n" 当作一个普通字符,而不是换行符。5. 使用修饰符 x 忽略空白符:正则表达式:/a b c/x匹配字符串:"abc",会忽略空格,等效于正则表达式 /abc/。

这只是一些基本示例,实际应用中可以根据具体需求选择适当的修饰符。需要注意的是,不同的语言和工具可能对修饰符的语法有所差异,请查阅相应的文档以获得准确的使用方式。

优先级关系

正则表达式中的元字符和操作符具有特定的优先级关系,用于确定匹配规则的组合顺序。以下是常见的优先级从高到低的顺序:

1. 转义符号:\(反斜杠)用于转义具有特殊意义的字符,例如\.表示匹配实际的"."字符。2. 括号:()(圆括号)用于创建子表达式,并确定它们的作用范围。3. 量词:*、+、?、{n}、{n,}、{n,m}等用于指定重复次数。4. 字符类:[](方括号)用于指定可供选择的字符范围,例如[a-z]表示匹配小写字母。5. 位置匹配符号:^(脱字符)和$(美元符号)用于匹配字符串的开头和结尾。6. 选择符号:|(管道符号)用于表示或的关系,匹配其中一个表达式。

优先级关系决定了正则表达式的组合顺序,从而影响了匹配的结果。当多个元字符或操作符同时出现时,按照优先级进行解析和匹配。需要注意的是,可以使用括号来改变优先级关系,明确指定子表达式的作用范围。在编写复杂的正则表达式时,合理利用优先级关系可以确保匹配规则的准确性和可读性。

re模块的使用

在Python中,re模块是用来进行正则表达式操作的标准库。以下是re模块的一些常见用法:

1. 正则表达式匹配:- re.match(pattern, string):从字符串的起始位置开始匹配,返回一个match对象或None。- re.search(pattern, string):在字符串中搜索第一个匹配项,返回一个match对象或None。- re.findall(pattern, string):找到字符串中所有匹配的子串,并以列表形式返回。- re.finditer(pattern, string):找到字符串中所有匹配的子串,并以迭代器形式返回。2. 匹配对象(match对象)的方法和属性:- group():返回匹配到的字符串。- start():返回匹配字符串的起始位置。- end():返回匹配字符串的结束位置。- span():返回匹配字符串的起始和结束位置。3. 正则表达式的修饰符(可用re.compile()或在pattern中指定):- re.I或re.IGNORECASE:忽略大小写匹配。- re.M或re.MULTILINE:多行匹配。- re.S或re.DOTALL:包括换行符在内的所有字符匹配。4. 字符串操作:- re.split(pattern, string):根据正则表达式的匹配项来分割字符串,返回以列表形式存储的分割结果。- re.sub(pattern, repl, string):用repl替换字符串中匹配到的子串,返回替换后的字符串。- re.subn(pattern, repl, string):与re.sub()方法类似,但同时返回替换次数。

这只是re模块的一些常见用法,还有更多高级功能可以通过阅读官方文档来学习和掌握。在使用re模块时,需要熟悉正则表达式的语法和规则,以及合理应用各种方法和修饰符来实现特定的匹配需求。

接下来我们通过一个小案例来了解一下re模块中matchsearchfindall三种匹配方法的使用。

import retext = "Hello, I am a Python developer. Nice to meet you!"# 使用match方法
pattern = r"Hello"
match_result = re.match(pattern, text)
if match_result:print("Match found with match method!")
else:print("No match found with match method.")# 使用search方法
pattern = r"Python"
search_result = re.search(pattern, text)
if search_result:print("Match found with search method!")
else:print("No match found with search method.")# 使用findall方法
pattern = r"\b\w+\b"
findall_result = re.findall(pattern, text)
if findall_result:print("Matches found with findall method:", findall_result)
else:print("No matches found with findall method.")

执行结果:

在这里插入图片描述

在这个案例中,我们首先定义了一个待匹配的字符串text,并定义了三个不同的正则表达式模式。然后,我们分别使用match、search和findall方法来查找模式在字符串中的匹配项。

  • match方法:它从字符串的开头开始匹配,如果能够找到匹配项,则返回一个match对象。在本例中,match方法可以找到“Hello”这个单词,因为它是字符串的开头。所以match方法返回的结果不是None,从而输出了"Match found with match method!"。
  • search方法:它在字符串中进行搜索,如果找到了第一个匹配项,则返回一个match对象。在本例中,search方法可以找到“Python”这个单词,所以search方法返回的结果不是None,从而输出了"Match found with search method!"。
  • findall方法:它在字符串中查找所有匹配项,并以列表的形式返回。在本例中,我们的模式是匹配英文单词,所以findall方法能够找到字符串中所有的单词,并返回一个包含这些单词的列表。输出了"Matches found with findall method"和所有的匹配项。

相关文章:

Python基础语法入门(第二十三天)——正则表达式

正则表达式是一种文本模式,用于匹配字符串,它是由字符和特殊字符组成的模式。正则表达式可以用于验证、搜索、替换和提取字符串。其能够应用于各种编程语言和文本处理工具中,如Python、Java、JavaScript等。 正则表达式在线测试工具&#xf…...

山西电力市场日前价格预测【2023-08-20】

日前价格预测 预测明日(2023-08-20)山西电力市场全天平均日前电价为341.71元/MWh。其中,最高日前电价为367.66元/MWh,预计出现在20: 30。最低日前电价为318.47元/MWh,预计出现在04: 15。 价差方向预测 1: 实…...

C++中function,bind,lambda

c11之前&#xff0c;STL中提供了bind1st以及bind2nd绑定器 首先来看一下他们如何使用&#xff1a; 如果我们要对vector中的元素排序&#xff0c;首先会想到sort&#xff0c;比如&#xff1a; void output(const vector<int> &vec) {for (auto v : vec) {cout <&l…...

跟着美团学设计模式(感处)

读了着篇文章之后发现真的是&#xff0c;你的思想&#xff0c;你的思维是真的比比你拥有什么技术要强的。 注 开闭原则 开闭原则&#xff08;Open-Closed Principle&#xff09;是面向对象设计中的基本原则之一&#xff0c;它的定义是&#xff1a;一个软件实体应该对扩展开放…...

2023/8/19 小红书 Java 后台开发面经

项目都做了些什么&#xff0c;怎么实现的用Redis实现了什么&#xff0c;Redis是单线程的吗&#xff0c;Redis是单线程的为什么快&#xff0c;IO多路复用模型具体实现&#xff0c;持久化怎么实现的为什么用Kafka&#xff0c;架构是什么样的&#xff0c;Broker、Topic、Partition…...

基于traccar快捷搭建gps轨迹应用

0. 环境 - win10 虚拟机ubuntu18 - i5 ubuntu22笔记本 - USB-GPS模块一台&#xff0c;比如华大北斗TAU1312-232板 - 双笔记本组网设备&#xff1a;路由器&#xff0c;使得win10笔记本ip&#xff1a;192.168.123.x&#xff0c;而i5笔记本IP是192.168.123.215。 - 安卓 手机 1.…...

【深度学习-图像识别】使用fastai对Caltech101数据集进行图像多分类(50行以内的代码就可达到很高准确率)

文章目录 前言fastai介绍数据集介绍 一、环境准备二、数据集处理1.数据目录结构2.导入依赖项2.读入数据3.模型构建3.1 寻找合适的学习率3.2 模型调优 4.模型保存与应用 总结人工智能-图像识别 系列文章目录 前言 fastai介绍 fastai 是一个深度学习库&#xff0c;它为从业人员…...

Debian10: 安装nut服务器(UPS)

UPS说明&#xff1a; UPS的作用就不必讲了&#xff0c;我选择是SANTAKTGBOX-850&#xff0c;规格为 850VA/510W&#xff0c;可以满足所需&#xff0c;关键是Debian10自带了驱动可以支持&#xff0c;免去安装驱动&#xff0c;将UPS通过USB线连接服务器即可&#xff0c;如下图所示…...

神经网络基础-神经网络补充概念-47-动量梯度下降法

概念 动量梯度下降法&#xff08;Momentum Gradient Descent&#xff09;是一种优化算法&#xff0c;用于加速梯度下降的收敛速度&#xff0c;特别是在存在高曲率、平原或局部最小值的情况下。动量法引入了一个称为“动量”&#xff08;momentum&#xff09;的概念&#xff0c…...

C++11并发与多线程笔记(13) 补充知识、线程池浅谈、数量谈、总结

C11并发与多线程笔记&#xff08;13&#xff09; 补充知识、线程池浅谈、数量谈、总结 1、补充一些知识点1.1 虚假唤醒&#xff1a;1.2 atomic 2、浅谈线程池&#xff1a;3、线程创建数量谈&#xff1a; 1、补充一些知识点 1.1 虚假唤醒&#xff1a; notify_one或者notify_al…...

python高级基础

文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础 闭包 简单解释一下闭包就是可以在内部访问外部函数的变量&#xff0c;因为如果声明全局变量&#xff0c;那在后面就有可能会修改 在闭包中的…...

使用线性回归模型优化权重:探索数据拟合的基础

文章目录 前言一、示例代码二、示例代码解读1.线性回归模型2.MSE损失函数3.优化过程4.结果解读 总结 前言 在机器学习和数据科学中&#xff0c;线性回归是一种常见而重要的方法。本文将以一个简单的代码示例为基础&#xff0c;介绍线性回归的基本原理和应用。将使用Python和Nu…...

亿级短视频,如何架构?

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常指导大家面试架构&#xff0c;拿高端offer。 前几天&#xff0c;指导一个年薪100W小伙伴&#xff0c;拿到字节面试邀请。 遇到一个 非常、非常高频的一个面试题&#xff0c;但是很不好回答&#xff0…...

jenkins pipeline方式一键部署github项目

上篇&#xff1a;jenkins一键部署github项目 该篇使用jenkins pipeline-script一键部署&#xff0c;且介绍pipeline-scm jenkins环境配置 前言&#xff1a;按照上篇创建pipeline任务&#xff0c;结果报mvn&#xff0c;jdk环境不存在&#xff0c;就很疑惑&#xff0c;然后配置全…...

Vue 项目搭建

环境配置 1. 安装node.js 官网&#xff1a;nodejs&#xff08;推荐 v10 以上&#xff09; 官网&#xff1a;npm 是什么&#xff1f; 由于vue的安装与创建依赖node.js&#xff08;JavaScript的运行环境&#xff09;里的npm&#xff08;包管理和分发工具&#xff09;&#xff…...

【NetCore】09-中间件

文章目录 中间件&#xff1a;掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过…...

机器学习深度学习——BERT(来自transformer的双向编码器表示)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——transformer&#xff08;机器翻译的再实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&am…...

Datawhale Django后端开发入门 Vscode TASK02 Admin管理员、外键的使用

一.Admin管理员的使用 1、启动django服务 使用创建管理员之前&#xff0c;一定要先启动django服务&#xff0c;虽然TASK01和TASK02是分开的&#xff0c;但是进行第二个流程的时候记得先启动django服务&#xff0c;注意此时是在你的项目文件夹下启动的&#xff0c;时刻注意要执…...

【ES5和ES6】数组遍历的各种方法集合

一、ES5的方法 1.for循环 let arr [1, 2, 3] for (let i 0; i < arr.length; i) {console.log(arr[i]) } // 1 // 2 // 32.forEach() 特点&#xff1a; 没有返回值&#xff0c;只是针对每个元素调用func三个参数&#xff1a;item, index, arr &#xff1b;当前项&#…...

学科在线教育元宇宙VR虚拟仿真平台落实更高质量的交互学习

为推动教育数字化&#xff0c;建设全民终身学习的学习型社会、学习型大国&#xff0c;元宇宙企业深圳华锐视点深度融合VR虚拟现实、数字孪生、云计算和三维建模等技术&#xff0c;搭建教育元宇宙平台&#xff0c;为学生提供更加沉浸式的学习体验&#xff0c;提高学习效果和兴趣…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...