Python正则表达式学习笔记(入门)

1. 介绍

正则表达式是一种强大的模式匹配工具,用于处理文本数据。在Python中,我们使用re模块来操作正则表达式。

2. 基本语法

建议先看
"5. re模块函数"了解searchmatch的区别"和
2.3 特殊字符转义"了解如何应对特殊符号

2.1 字符匹配

  1. .: 匹配任意字符(除了换行符 \n
import re
pattern = re.compile(r"he..o")
result = pattern.match("hello")
print(result.group())  

Output: hello

  • []: 匹配方括号内的任一字符
    pattern = re.compile(r"[aeiou]")
    result = pattern.search("Hello")
    print(result.group()) 
    

Output: e

注意:方括号内的字母之间无需空格,因为空格算一个字符,也会参与匹配

  • |: 匹配两个或多个模式之一
    pattern = re.compile(r"cat|dog")
    result = pattern.search("I love my cat")
    print(result.group())  
    

Output: cat

2.2 重复匹配

  • *: 匹配前一个字符0次或多次

  • +: 匹配前一个字符1次或多次

  • ?: 匹配前一个字符0次或1次

    pattern = re.compile(r"go*gle")
    result = pattern.match("gooogle")
    print(result.group())  
    

    Output: gooogle

2.3 特殊字符转义

使用\转义特殊字符,如.*+

3. 弱进阶用法

敲黑板:groups() 用于返回捕获组的匹配结果元组,
group() 用于返回整个匹配结果或指定编号的捕获组的匹配结果
要注意的是,捕获组编号从 1 开始计数,而不是从 0 开始。

3.1 分组和捕获

使用圆括号 () 进行分组和捕获

pattern = re.compile(r"(\d+)-(\d+)-(\d+)")
result = pattern.match("2023-11-15")
print(result.groups()) 

Output: (‘2023’, ‘11’, ‘15’)
当内容很重要时,捕获以后可以 方便后面引用

3.2 非捕获组

有时我们需要分组但不捕获,可以使用 (?:...)

pattern = re.compile(r"Mr (?:John|Doe)")
result = pattern.match("Mr John")
print(result.group())  

Output: Mr John
不重要的内容无需捕获,可以提高程序性能,减少资源占用

3.3 向后引用

使用\1\2等引用前面捕获的组的内容(再次强调:是内容,而不是格式)

pattern = re.compile(r"(\d+)-\1")
result = pattern.match("2023-2023")
print(result.group()) 

Output: 2023-2023

4. 匹配开始和结尾

  • ^: 匹配字符串的开始

  • $: 匹配字符串的结尾

    pattern = re.compile(r"^Hello")
    result = pattern.match("Hello, World!")
    print(result.group()) 
    

Output: Hello

pattern = re.compile(r"(World!$)")
result = pattern.search("Hello, World!")
print(result.group())

Output: World!

在正则表达式中,^ 用于匹配一行的开头,而不是整个文本的开头,
当使用 ^ 放在正则表达式的开头时,它表示该模式只匹配行的开头位置
换句话说,模式必须在行的开头出现才能匹配成功
例如,如果你有一个多行的字符串,每行以数字开头,你可以使用 ^\d 来匹配每行的开头数字。

$ 匹配字符串的结尾,同理

5. re模块函数

  • re.match(): 从字符串的开头匹配模式
  • re.search(): 在字符串中查找匹配模式的第一个位置
  • re.findall(): 返回字符串中所有匹配的模式
  • re.sub(): 替换字符串中匹配模式的部分

6. 贪婪与非贪婪匹配

在重复匹配时,加上?可以实现非贪婪匹配。

pattern = re.compile(r"<.*?>")
result = pattern.search("<html><head><title>Title</title></head></html>")
print(result.group()) 

Output:

默认情况下,正则表达式是贪婪匹配,也就是它会尽可能地匹配最长的字符串。贪婪匹配会将模式中的量词(如 *、+、?、{})设置为尽可能多地匹配字符。
例如,正则表达式 a.*b 可以匹配 “afoobarb” 中的整个字符串,而不只是 “a” 和 “b” 之间的部分。

相比之下,非贪婪匹配匹配尽可能少的字符。它使用量词的非贪婪版本来实现。在正则表达式中,非贪婪模式的量词是加上 ? 符号。
例如,a.*?b 是一个非贪婪匹配模式,它只匹配 “a” 和 “b” 之间的最短字符串。对于 “afoobarb”,匹配结果将是 “afoob”。

7. 预搜索

  • (?=...): 正向预查

  • (?!...): 负向预查

    pattern = re.compile(r"\d+(?=%)")
    result = pattern.search("42%")
    print(result.group())  
    

Output: 42

正向预查 (?=…) 表示在匹配当前位置之后的内容时,需要满足 … 的条件。但是,正向预查不会消耗字符串,也不会将预查的内容包含在匹配结果中。
负向预查 (?!..) 则表示在匹配当前位置之后的内容时,需要不满足 … 的条件才能匹配成功。与正向预查类似,负向预查也不会消耗字符串,也不会将预查的内容包含在匹配结果中。
相当于先判断后面的字符串是否符合条件决定是否匹配

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

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

相关文章

MATLAB与Excel的数据交互

准备阶段 clear all % 添加Excel函数 try Excel=actxGetRunningServer(Excel.Application); catch Excel=actxserver(Excel.application); end % 设置Excel可见 Excel.visible=1; 插入数据 % % 激活eSheet1 % eSheet1.Activate; % 或者 % Activate(eSheet1); % % 打开…

js:react使用zustand实现状态管理

文档 https://www.npmjs.com/package/zustandhttps://github.com/pmndrs/zustandhttps://docs.pmnd.rs/zustand/getting-started/introduction 安装 npm install zustand示例 定义store store/index.js import { create } from "zustand";export const useCount…

【漏洞复现】浙大恩特CRM文件上传0day

漏洞描述 浙大恩特客户资源管理系统任意文件上传漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用…

C 语言 gets()和puts()

C 语言 gets()和puts() gets()和puts()在头文件stdio.h中声明。这两个函数用于字符串的输入/输出操作。 C gets()函数 gets()函数使用户可以输入一些字符&#xff0c;然后按Enter键。 用户输入的所有字符都存储在字符数组中。 空字符将添加到数组以使其成为字符串。 gets()允…

Rust开发——切片(slice)类型

1、什么是切片 在 Rust 中&#xff0c;切片&#xff08;slice&#xff09;是一种基本类型和序列类型。在 Rust 官方文档中&#xff0c;切片被定义为“对连续序列的动态大小视图”。 但在rust的Github 源码中切片被定义如下&#xff1a; 切片是对一块内存的视图&#xff0c;表…

【草料】uni-app ts vue 小程序 如何如何通过草料生成对应的模块化二维码

一、查看uni-app项目 1、找到路径 可以看到项目从 src-race-pages-group 这个使我们目标的查询页面 下面我们将这个路径copy到草料内 2、找到进入页面入参 一般我们都会选择 onload() 函数下的入参 这里我们参数的是 id 二、草料 建议看完这里的教程文档 十分清晰&#xff01…

【Linux】C文件系统详解(三)——如何理解缓冲区以及自主封装一个文件接口

文章目录 如何理解缓冲区现象概念:文件缓冲区为什么要有缓冲区缓冲区在哪里 自己封装一个简单的文件接口自主封装目标 代码关于缓冲区强制刷新内核 关于字符串格式化函数printf和scanf函数 如何理解缓冲区 以前写过一个进度条, 有一个输出缓冲区->这个缓冲区在哪里,为什么要…

hyperledger fabric2.4测试网络添加组织数量

!!!修改内容比较繁琐,预期未来提供模板修改 修改初始配置文件,初始添加3个组织 organizations文件夹 /cryptogen文件夹下创建文件crypto-config-org3.yaml,内容如下: PeerOrgs:# ---------------------------------------------------------------------------# Org3# ----…

酷柚易汛ERP - 序列号盘点操作指南

1、应用场景 将系统中开启序列号的商品数量与与实际存放的数量进行对比。 2、主要操作 2.1 录入序列号 打开【盘点】-【序列号盘点】&#xff0c;新增序列号盘点单&#xff0c;点击【SN】按钮&#xff0c;在弹框中输入序列号。 支持扫描枪录入序列号支持复制粘贴序列号录入…

Java(二)(String的常见方法,ArrayList的常见方法)

String 创建string对象 package Helloworld;public class dome1 {public static void main(String[] args) {// 1.直接双引号得到字符串对象,封装字符串对象String name "lihao";System.out.println(name);// 2. new String 创建字符串对象,并调用构造器初始化字符…

Vue第1天:特性概览

文章目录 Vue.js 简介 Vue的特性 如何使用Vue 安装Vue 通过CDN引入 使用npm 创建Vue实例 结语 Vue.js 简介 Vue.js&#xff08;通常简称为Vue&#xff09;是一款流行的JavaScript框架&#xff0c;专注于构建用户界面。它的设计灵感来自于现代的JavaScript框架&#xf…

用Java写一个贪吃蛇游戏

目录 创建窗体 创建游戏棋盘 创建蛇的节点 创建蛇身 让蛇移动 添加键盘监听 添加边界处理 把食物绘制到棋盘上 吃食物 创建窗体 创建一个MainFrame类继承JFrame&#xff0c;表示主窗体。 public class MainFrame extends JFrame {//创建窗体对象时&#xff0c;初始化…

力扣 字母异位词分组 哈表 集合

&#x1f468;‍&#x1f3eb; 力扣 字母异位词分组 ⭐ 思路 由于互为字母异位词的两个字符串包含的字母相同&#xff0c;因此对两个字符串分别进行排序之后得到的字符串一定是相同的&#xff0c;故可以将排序之后的字符串作为哈希表的键。 &#x1f351; AC code class Solut…

解析Spring Boot中的CommandLineRunner和ApplicationRunner:用法、区别和适用场景详解

在Spring Boot应用程序中&#xff0c;CommandLineRunner和ApplicationRunner是两个重要的接口&#xff0c;它们允许我们在应用程序启动后执行一些初始化任务。本文将介绍CommandLineRunner和ApplicationRunner的区别&#xff0c;并提供代码示例和使用场景&#xff0c;让我们更好…

阿里云配置ssl(Apache)

阿里云申请证书&#xff0c;有个专门的免费的申请方式与普通证书是平级的功能&#xff1b; 访问服务器&#xff0c;判断apache是不是开启ssl功能&#xff0c;如果没有安装就安装它 [rootcentos ~]# rpm -qa | grep mod_ssl //什么没显示说明没装 yum install mod_ssl openssl …

公共字段自动填充-@TableField的fill实现(2)

TheadLocal 客户端发送的每次http请求&#xff0c;在服务端都会分配新的线程。因此登录检查过滤器、controller、元数据对象处理器属于一个线程。 TheadLocal是线程的局部变量&#xff1a; TheadLocal常用方法&#xff1a; 如何在元数据对象处理器中获取当前登录用户的id&…

大数据专业有哪些基础的理论和技术

大数据专业有哪些基础的理论和技术 大数据专业涉及的基础理论和技术很广泛&#xff0c;主要包括以下几个方面&#xff1a; 数据管理与处理理论&#xff1a;大数据处理涉及到海量数据的管理、存储和处理&#xff0c;因此数据库理论、数据结构与算法、数据压缩与索引等知识是非常…

Spring Boot 项目部署方案!打包 + Shell 脚本部署详解

文章目录 概要一 、profiles指定不同环境的配置二、maven-assembly-plugin打发布压缩包三、 分享shenniu_publish.sh程序启动工具四、linux上使用shenniu_publish.sh启动程序 概要 本篇和大家分享的是springboot打包并结合shell脚本命令部署&#xff0c;重点在分享一个shell程…

【MATLAB源码-第83期】基于matlab的MIMO中V-BALST结构ZF和MMSE检测算法性能误码率对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在多输入多输出&#xff08;MIMO&#xff09;通信系统中&#xff0c;V-BLAST&#xff08;垂直波束形成层间空间时间编码技术&#xff09;是一种流行的技术&#xff0c;用于提高无线通信的数据传输速率和容量。它通过在不同的…

如何将 Docsify 项目部署到 CentOS 系统的 Nginx 中

文章目录 第一步&#xff1a;准备 CentOS 服务器第二步&#xff1a;安装 Node.js 和 Docsify第三步&#xff1a;初始化 Docsify 项目第四步&#xff1a;本地预览 Docsify 项目第五步&#xff1a;配置 Nginx 服务器第六步&#xff1a;重启 Nginx 服务器拓展&#xff1a;使用 HTT…