当前位置: 首页 > 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操作&…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...