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

【第八节】python正则表达式

目录

一、python中的re模块

1.1 基本匹配和搜索

1.2 替换和分割

1.3 编译正则表达式

二、正则表达式对象

2.1 re.RegexObject 和 re.MatchObject

2.2 正则表达式修饰符 - 可选标志

2.3 正则表达式模式

2.4 正则表达式实例


一、python中的re模块

        正则表达式是一种独特的字符序列,它能够协助你轻松地验证一个字符串是否符合特定的模式。

        自Python 1.5版本以来,引入了re模块,该模块支持Perl风格的正则表达式模式。

        re模块赋予了Python完整的正则表达式处理能力。

        通过compile函数,可以根据一个模式字符串和可选的标志参数创建一个正则表达式对象。这个对象包含了一系列方法,用于进行正则表达式的匹配和替换操作。

        此外,re模块还提供了与这些方法功能相同的函数,这些函数以一个模式字符串作为它们的第一个参数。本章节将重点介绍Python中常用的正则表达式处理函数。

1.1 基本匹配和搜索

        Python中的正则表达式是通过`re`模块来实现的,这个模块提供了一系列函数和方法来处理字符串匹配和搜索。以下是一些常用的正则表达式功能和示例:

### 基本匹配和搜索

1. **匹配字符串**:使用`re.match()`函数检查字符串是否以特定模式开始。
2. **搜索字符串**:使用`re.search()`函数在字符串中查找第一个匹配的模式。

它们的语法规则类似:

re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)

re.match与re.search的区别

        re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。


3. **查找所有匹配**:使用`re.findall()`函数返回字符串中所有匹配的列表。

        在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式为:

findall(string[, pos[, endpos]])

参数:

  • string : 待匹配的字符串。
  • pos : 可选参数,指定字符串的起始位置,默认为 0。
  • endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

三者用法如下:

import re# 匹配字符串
result = re.match(r'Hello', 'Hello, world!')
print(result)  # 输出: <re.Match object; span=(0, 5), match='Hello'># 搜索字符串
result = re.search(r'world', 'Hello, world!')
print(result)  # 输出: <re.Match object; span=(7, 12), match='world'># 查找所有匹配
result = re.findall(r'\w+', 'Hello, world!')
print(result)  # 输出: ['Hello', 'world']

4. finditer

        和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。语法如下:

re.finditer(pattern, string, flags=0)

代码举例:

# -*- coding: UTF-8 -*-import reit = re.finditer(r"\d+","12a32bc43jf3") 
for match in it: print (match.group() )

5. flags参数

        在Python的re模块中,re.match()函数和类似的正则表达式函数(如re.search()re.findall()等)可以使用flags参数来修改正则表达式的匹配行为。flags参数可以是一个或多个标志的组合,这些标志通过按位或(|)操作符组合在一起。以下是一些常用的flags值:

1)re.IGNORECASE (re.I):

    忽略大小写进行匹配。

2)re.MULTILINE (re.M):

    多行模式,改变^和$的行为,使它们分别匹配每一行的开始和结束,而不仅仅是整个字符串的开始和结束。

3)re.DOTALL (re.S):

    使.特殊字符匹配包括换行符在内的所有字符。

4)re.UNICODE (re.U):

    使\w、\W、\b、\B、\d、\D、\s、\S等字符类遵循Unicode字符属性数据库的规则。这个标志在Python 3中是默认行为,因为默认情况下字符串是Unicode的。

5)re.ASCII (re.A):

    使\w、\W、\b、\B、\d、\D、\s、\S等字符类只匹配ASCII字符。

6)re.VERBOSE (re.X):

    允许编写更具可读性的正则表达式,可以包含注释和空格,这些在匹配时会被忽略。

7)re.DEBUG:

    显示有关编译表达式的调试信息。

这些标志可以组合使用,例如:

import repattern = r'hello'
string = 'Hello, hello, HELLO in the world!'# 使用忽略大小写标志
matches = re.findall(pattern, string, re.IGNORECASE)
print(matches)  # 输出: ['Hello', 'hello', 'HELLO']

        在这个例子中,re.IGNORECASE标志被传递给re.findall()函数,使得正则表达式模式'hello'在匹配时忽略大小写,因此它能够匹配字符串中的所有大小写变体。

6. group函数

        我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

#!/usr/bin/python
import reline = "Cats are smarter than dogs"matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)if matchObj:print "matchObj.group() : ", matchObj.group()print "matchObj.group(1) : ", matchObj.group(1)print "matchObj.group(2) : ", matchObj.group(2)
else:print "No match!!"

以上实例执行结果如下:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

1.2 替换和分割

1. **替换字符串**:使用`re.sub()`函数替换字符串中的匹配模式。

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, count=0, flags=0)

参数:

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

        当`repl`参数是一个函数时,`re.sub()`函数会在每次匹配时调用这个函数,并将匹配对象作为参数传递给该函数。函数返回的值将作为替换字符串。以下是一个示例代码,展示了如何使用函数作为`repl`参数:

import redef replacer(match):# 获取匹配对象的组matched_text = match.group(0)# 对匹配的文本进行处理,例如转换为大写return matched_text.upper()# 定义正则表达式模式
pattern = r'\b\w+\b'  # 匹配单词# 定义要处理的字符串
string = 'hello world, this is a test.'# 使用函数作为 repl 参数
result = re.sub(pattern, replacer, string, flags=re.IGNORECASE)print(result)  # 输出: 'HELLO WORLD, THIS IS A TEST.'

        在这个例子中,`replacer`函数接收一个匹配对象`match`,并返回匹配文本的大写版本。`re.sub()`函数在每次匹配时调用`replacer`函数,并用函数返回的值替换匹配的文本。`flags=re.IGNORECASE`标志使得匹配忽略大小写,因此所有的单词都会被转换为大写。

        你可以根据需要自定义`replacer`函数,以实现不同的替换逻辑。


2. **分割字符串**:使用`re.split()`函数根据模式分割字符串。

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

import re# 替换字符串
result = re.sub(r'world', 'Python', 'Hello, world!')
print(result)  # 输出: Hello, Python!# 分割字符串
result = re.split(r'\s+', 'Hello  world')
print(result)  # 输出: ['Hello', 'world']

1.3 编译正则表达式

        为了提高效率,可以使用`re.compile()`函数将正则表达式编译成一个正则表达式对象,然后使用该对象的方法进行匹配和搜索。

        compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

语法格式为:

re.compile(pattern[, flags])

参数:

  • pattern : 一个字符串形式的正则表达式

  • flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:

    1. re.I 忽略大小写
    2. re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
    3. re.M 多行模式
    4. re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
    5. re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
    6. re.X 为了增加可读性,忽略空格和 # 后面的注释
import re# 编译正则表达式
pattern = re.compile(r'\d+')# 使用编译后的对象进行匹配
result = pattern.findall('123 456 789')
print(result)  # 输出: ['123', '456', '789']

### 常用正则表达式符号

- `.`:匹配任意单个字符(除了换行符)。
- `^`:匹配字符串的开头。
- `$`:匹配字符串的结尾。
- `*`:匹配前面的字符零次或多次。
- `+`:匹配前面的字符一次或多次。
- `?`:匹配前面的字符零次或一次。
- `\d`:匹配任意数字。
- `\w`:匹配任意字母、数字或下划线。
- `\s`:匹配任意空白字符。

这些符号可以组合使用,以构建复杂的正则表达式模式。

### 示例

import re# 匹配电子邮件地址
pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
text = 'Contact us at support@example.com'
result = re.search(pattern, text)
print(result)  # 输出: <re.Match object; span=(15, 31), match='support@example.com'>

        通过这些功能和方法,Python的`re`模块提供了一个强大的工具集,用于处理和操作字符串中的模式匹配。

二、正则表达式对象

2.1 re.RegexObject 和 re.MatchObject

re.RegexObject

re.compile() 返回 RegexObject 对象。

re.MatchObject

group() 返回被 RE 匹配的字符串。

  • start() 返回匹配开始的位置
  • end() 返回匹配结束的位置
  • span() 返回一个元组包含匹配 (开始,结束) 的位置

2.2 正则表达式修饰符 - 可选标志

        正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

2.3 正则表达式模式

正则表达式模式采用了特定的语法规则来定义匹配规则:

        字母和数字在模式中直接表示其本身。在正则表达式模式中,字母和数字将匹配与其相同的字符。

        当字母和数字前面加上一个反斜杠(\)时,它们通常会获得不同的含义,从而执行特殊的匹配功能。

        标点符号除非经过转义处理,否则它们不会匹配其自身,而是执行特定的功能,表示某种特殊含义。

        反斜杠本身是一个特殊字符,因此需要通过另一个反斜杠来进行转义。

        鉴于正则表达式中频繁使用反斜杠,建议采用原始字符串(以 'r' 开头)来表示这些模式,以避免转义字符的混淆。例如,模式元素如 r'\t' 实际上等同于 '\\t',它们都匹配制表符。

        以下表格概述了正则表达式模式语法中的特殊元素。若在定义模式时附加了可选的标志参数,某些特殊元素的行为可能会发生变化。

2.4 正则表达式实例

相关文章:

【第八节】python正则表达式

目录 一、python中的re模块 1.1 基本匹配和搜索 1.2 替换和分割 1.3 编译正则表达式 二、正则表达式对象 2.1 re.RegexObject 和 re.MatchObject 2.2 正则表达式修饰符 - 可选标志 2.3 正则表达式模式 2.4 正则表达式实例 一、python中的re模块 正则表达式是一种独特的…...

三大浏览器Google Chrome、Edge、Firefox内存占用对比

问题 Chrome、Edg、Firefox三家究竟谁的占用少 结论 打开一个页面内存占用 Firefox>Edge>Chrome 打开打量页面内存占用 Firefox>Chrome>Edge 从监视器可以看到Edge增加一个页面增加一个页面不到100M而其它浏览器需要150M左右;Firefox浏览器主线程内存占用800M比…...

【wiki知识库】08.添加用户登录功能--后端SpringBoot部分

目录 一、今日目标 二、SpringBoot后端实现 2.1 新增UserLoginParam 2.2 修改UserController 2.3 UserServiceImpl代码 2.4 创建用户上下文工具类 2.5 通过token校验用户&#xff08;重要&#xff09; 2.6 创建WebMvcConfig 2.7 用户权限校验拦截器 一、今日目标 上篇…...

vue中nextTick的作用

nextTick是Vue.js提供的一个非常有用的方法&#xff0c;其主要作用是在DOM更新之后执行延迟回调函数。以下是nextTick的具体作用及其实现原理的详细解析&#xff1a; nextTick的作用 确保DOM更新完成&#xff1a; 当Vue实例的数据发生变化时&#xff0c;Vue会异步地更新DOM。…...

计算机网络面试-核心概念-问题理解

目录 1.计算机网络OSI协议七层结构功能分别是什么&#xff1f;如何理解这些功能 2.物理层、数据链路层、网络层、传输层和应用层&#xff0c;这五个层之间功能的关系&#xff0c;或者说是否存在协调关系 3. 数据链路层功能理解 4.MAC地址和以太网协议 5.以太网协议中的CSMA…...

go语言创建协程

前言 Go 语言中&#xff0c;协程是通过 go 关键字来创建的&#xff0c;这使得 Go 语言成为实现并发程序的一个非常直观和强大的工具。Go 运行时管理着协程&#xff0c;这些协程在内部被称为 goroutine。 协程&#xff08;goroutines&#xff09;本身是轻量级的线程&#xff0c;…...

RabbitMQ之基于注解声明队列交换机:使用@RabbitListener实现消息监听

文章目录 什么是RabbitListener&#xff1f;队列和交换机的基本概念使用RabbitListener注解声明队列和交换机代码解析1. QueueBinding2. 消费者方法 运行原理应用场景总结 在现代的微服务架构中&#xff0c;消息队列是一种重要的异步通信机制。RabbitMQ作为一种流行的消息代理软…...

【grafana 】mac端grafana配置的文件 grafana.ini 及login

brew services start grafana 以后,怎么知道mac端的配置文件的路径 brew services restart grafana#brew services start grafana在macOS上使用Homebrew安装并启动Grafana服务后,通常的配置文件路径是在以下两个位置之一: Homebrew默认配置文件路径:/usr/local/etc/grafana…...

程序员如何在人工智能时代保持核心竞争力

目录 1.概述 1.1. 技术深度与广度的平衡 1.2. 软技能的培养 1.3. 持续学习和适应性 1.4. 理解和应用AI 1.5. 伦理和责任意识 2.AI辅助编程对程序员工作的影响 2.1.AI工具对编码实践的积极影响 2.2.AI工具的潜在风险 2.3.如何平衡利与弊 3.程序员应重点发展的核心能力…...

回溯排列+棋盘问题篇--代码随想录算法训练营第二十三天| 46.全排列,47.全排列 II,51. N皇后,37. 解数独

46.全排列 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a; 组合与排列的区别&#xff0c;回溯算法求解的时候&#xff0c;有何不同&#xff1f; 题目描述&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能…...

ESXI加入VMware现有集群提示常规性错误

集群内有vSphere6.5和6.7的版本&#xff0c;都开启了EVC 这台老服务器是DELL R710添加时报错&#xff0c;网上查了些资料说要重装ESXI或者关闭EVC等等 最终解决方法是&#xff0c;给这台ESXI配置一个NTP服务器&#xff0c;同步系统时间&#xff0c;之后即可正常加入集群 往期文…...

数字噪音计(声级计)【AR814数字噪音计】

系统介绍 声级计&#xff0c;又叫噪音计&#xff0c;是噪声测量中最基本的仪器。声级计一般由电容式传声器、前置放大器、衰减器、放大器、频率计权网络以及有效值指示表头等组成。 声级计的工作原理是&#xff1a;由传声器将声音转换成电信号&#xff0c;再由前置放大器放大…...

【Vue3】图片未加载成功前占位

背景 在写项目时&#xff0c;加载图片未成功前&#xff0c;会出现空白页面&#xff0c;太影响美观和体验感 解决方案 1. element ui通过slot占位符解决 2. 自定义指令 原生img标签可以通过自定义指令解决&#xff0c;img标签有onload和onerror事件&#xff0c;都是在渲染成…...

AbstractQueuedSynchronizer之AQS

目录 AQS简单入门为什么说AQS是JUC包下的重要基石AQS能干嘛&#xff1f;实际实现原理AQS自身成员变量Node内部类的成员变量源码解读总结 AQS简单入门 AQS是抽象的队列同步器&#xff0c;是用来实现锁或者其它同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框架及…...

<数据集>起重机识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2984张 标注数量(xml文件个数)&#xff1a;2984 标注数量(txt文件个数)&#xff1a;2984 标注类别数&#xff1a;1 标注类别名称&#xff1a;[cranes] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;对…...

04--Docker

前言&#xff1a;前面写过关于DockerKubernetes的部署&#xff0c;主要是针对国产化linux系统的适配问题&#xff0c;并没有对docker进行复习。这里整理一下docker的知识点&#xff0c;用作容器化微服务的起点&#xff0c;主要为日常工作配置使用&#xff0c;本章可能有点长&am…...

MiniCPM-V: A GPT-4V Level MLLM on Your Phone 手机上的 GPT-4V 级多模态大模型

GitHub - OpenBMB/MiniCPM-V: MiniCPM-V 2.6: A GPT-4V Level MLLM for Single Image, Multi Image and Video on Your Phone 2408.01800 (arxiv.org) 目录 Introduction Model Architecture Training End-side Deployment MiniCPM-V是一种高效的多模态大型语言模型&…...

Unity初识

1&#xff1a;下载Unity Hub 下载地址&#xff1a;Unity官方下载_Unity最新版_从Unity Hub下载安装 | Unity中国官网 建议直接使用unity hub因为支持比较全面&#xff0c;适合新手 有中文 管理 编辑器等等功能支持 下载安装不过多介绍 2&#xff1a;Unity Hub汉化 因为我…...

【游戏引擎之路】登神长阶(九)——《3D游戏编程大师技巧》:我想成为游戏之神!

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…...

Linux:线程同步之信号量

信号量 (1)What&#xff08;什么是信号量&#xff09; 提供一种计数器的方式控制对共享资源的访问&#xff1b;当计数器大于0时&#xff0c;请求资源成功并计数器-1&#xff1b;当计数器小于0时&#xff0c;线程阻塞&#xff0c;等待其它线程执行signal&#xff08;V操作&…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

网站指纹识别

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

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...