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

news2024/11/16 13:50:45

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

text = "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"和所有的匹配项。

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

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

相关文章

Spring源码编译-for mac

超详细的spring源码编译 记:编译成功时间:2023.08.19 环境准备: 1.idea 2023.1.1 Community Edition 2.jdk1.8 3.gradlegradle-5.6.4 4.spring源码(版本:spring-framework-v5.2.25.RELEASE) 一.spring源码下载 github 加速网站&…

stm32单片机4个开关控制8个LED灯,4种不同模式参考源代码(附带PROTEUS电路图)

//main.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body************************************************************************…

0101前期准备-大数据学习

文章目录 1 前言2 配置VMware虚拟机2.1 设置主机名和固定IP2.2 本地系统与Linux系统配置主机名映射2.3 配置虚拟机之间用户的SSH免密互通2.4 安装JDK环境2.5 关闭防火墙和SELinux2.6 更新时区和同步时间2.7 保存虚拟机快照 结语 1 前言 我们从基础的hadoop开始学起,…

Python上楼梯问题:递归解法探究(斐波那契变种)(记忆化递归)

文章目录 上楼梯问题:递归解法探究问题定义解决方案1. 递归2. 记忆化递归关于python memo{}默认参数和字典的语法语法功能版本信息注意事项 结论 上楼梯问题:递归解法探究 在这篇文章中,将对上楼梯问题进行深入探讨。上楼梯问题是一种常见的…

2D应用开发是选择WebGL 还是选择Canvas?

推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 在介绍WebGL和Canvas的区别和联系之前,需要先了解它们各自的定义和特点。 WebGL是一种基于标准HTML5的技术,用于在Web浏览器中实时渲染3D图形。它是由Khronos Group开发的一套…

C++系列-内存模型

内存模型 内存模型四个区代码区全局区栈区堆区内存开辟和释放在堆区开辟数组 内存模型四个区 不同区域存放的数据生命周期是不同的,更为灵活。 代码区:存放函数体的二进制代码,操作系统管理。全局区:存放全局变量,常…

工厂模式的三种姿态?

在软件工程中常见的设计模式——工厂模式。工厂模式是一种有力的工具,用于创建对象实例的方式,可以帮助我们更好地组织代码和降低耦合性。在本文中,我将为大家详细介绍工厂模式的三种姿态,同时通过举例和代码演示来帮助大家更好地…

Docker环境安装elasticsearch和kibana

一、安装elasticsearch 创建es-network,让es、kibana在同一个网段: docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…

【Redis】Redis中的布隆过滤器

【Redis】Redis中的布隆过滤器 前言 在实际开发中,会遇到很多要判断一个元素是否在某个集合中的业务场景,类似于垃圾邮件的识别,恶意IP地址的访问,缓存穿透等情况。类似于缓存穿透这种情况,有许多的解决方法&#xf…

高效的WMS系统手持盘点方案

WMS系统手持盘点就是指利用WMS系统支持的手持式电子盘点设备进行库存盘点的方式。 具体来说: - 手持盘点设备是一种小型的电子设备,具有移动条形码扫描功能,可以实时与WMS系统联通。 - WMS系统利用手持设备,可以给仓储人员下发具体的盘点任务,例如需要盘点的货位、商品等信息…

mybatis plus 配置自动设置创建时间和创建人id

1.新建 MyMetaObjectHandler package com.ruoyi.framework.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.ruoyi.common.bean.LocalUser; import com.ruoyi.coupon.domain.CouponUser; import org.apache.ibatis.reflection.MetaObjec…

软件报错msvcr90.dll丢失的解决方法,亲测可以修复

我曾经遇到过一个令人头疼的问题:msvcr90.dll丢失。这个问题导致了我的程序无法正常运行,让我感到非常苦恼。然而,在经过一番努力后,我终于成功地修复了这个问题,这让我感到非常欣慰和满足。 msvcr90.dll丢失的原因可能…

python高级基础

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

深入探讨API接口测试:从基础到高级策略

引言:API测试的重要性 在当前的技术趋势中,API(应用程序接口)已经成为连接各种系统和服务的基石。API不仅仅是大型企业的领域,中小型公司和初创公司也越来越依赖API来拓展他们的业务功能和跨系统通信。正因如此&#…

企业数字化转型大数据湖一体化平台项目建设方案PPT

导读:原文《企业数字化转型大数据湖一体化平台项目建设方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以点赞评论转发…

(搜索) 剑指 Offer 38. 字符串的排列 ——【Leetcode每日一题】

❓剑指 Offer 38. 字符串的排列 难度:中等 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面 不能有重复元素。 示例: 输入:s “abc” 输出:[“abc”,“acb”,“bac”…

【学习日记】【FreeRTOS】时间片的实现

前言 本文以野火的教程和代码为基础,对 FreeRTOS 中时间片的概念作了解释,并且给出了实现方式,同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中,我们已经知道任务根据不同的优先级被放入就绪列表中不…

符号随机梯度下降算法SIGNSGD

考虑随机优化问题: 符号随机梯度下降(SIGNSGD)算法: 假设基础: 收敛定理: 联邦优化:

[Java优选系列第2弹]SpringMVC入门教程:从零开始搭建一个Web应用程序

想和你们分享我眼里的代码世界🗺️ 优选系列持续更新中💫 一直在等你,你终于来啦💖 绿色代表解释说明 黄色代表重点 红色代表精髓 SpringMVC是一个基于Java的Web框架,它使用了MVC&…

旅行越野SUV——捷途旅行者即将与大家见面!

从2020年开始,国内车市踊跃出许多性格鲜明的车型,例如坦克300、极氪001、蔚来ET5旅行版以及五菱悦野,虽然它们属于小众车型,但奈何销量都非常亮眼,这也从另一角度证明现如今的年轻消费群体很喜欢特点鲜明的汽车产品。前段时间,捷途汽车发布的捷途旅行者,一款定位旅行越野SUV的新…