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

第7章 模式匹配与正则表达式

目录

  • 1. 不用正则表达式来查找文本模式
  • 2. 用正则表达式来查找文本模式
    • 2.1 创建正则表达式(Regex)对象
    • 2.2 匹配Regex对象
  • 3. 用正则表达式匹配更多模式
    • 3.1 利用括号分组
    • 3.2 用管道匹配多个分组
    • 3.3 用问号实现可选匹配
    • 3.4 用星号匹配零次或多次
    • 3.5 用加号匹配一次或多次
    • 3.6 用花括号匹配特定次数
  • 4. 贪心和非贪心匹配
  • 5. findall() 方法
  • 6. 字符分类
  • 7. 建立自己的字符分类
  • 8. 插入字符和美元字符
  • 9. 通配字符
    • 9.1 用点-星匹配所有字符
    • 9.2 用句点字符匹配换行符
  • 10. 不区分大小写的匹配
  • 11. 用 sub() 方法替换字符串

1. 不用正则表达式来查找文本模式

def isPhoneNumber(text):if len(text) != 11:return Falsefor i in range(0, len(text)):if (i == 3 or i == 7) and text[i] != "-":return Falseelif i != 3 and i != 7 and not text[i].isdecimal():return Falsereturn Truetext = "123-456-789"
print(text)
print(isPhoneNumber(text))

2. 用正则表达式来查找文本模式

2.1 创建正则表达式(Regex)对象

import retext = re.compile(r'\d\d\d-\d\d\d-\d\d\d')

2.2 匹配Regex对象

import retext = re.compile(r'\d\d\d-\d\d\d-\d\d\d')
match = text.search("~~~123-456-789~~~")
print(match.group())

3. 用正则表达式匹配更多模式

3.1 利用括号分组

import retext = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d)')
match = text.search("~~~123-456-789~~~")
print(match.group(1))
# 123
print(match.group(2))
# 456-789
print(match.groups())
# ('123', '456-789')

3.2 用管道匹配多个分组

  • | :管道
import retext = re.compile(r'456|123')
match = text.search("123-456-789")
print(match.group())
# 123

3.3 用问号实现可选匹配

import retext = re.compile(r'\d\d\d(~)?\d\d\d')
match = text.search("123123")
print(match.group())
# 123123match = text.search("123~123")
print(match.group())
# 123~123

3.4 用星号匹配零次或多次

import retext = re.compile(r'\d\d\d(~)*\d\d\d')
match = text.search("123123")
print(match.group())
# 123123match = text.search("123~~~123")
print(match.group())
# 123~~~123

3.5 用加号匹配一次或多次

import retext = re.compile(r'\d\d\d(~)+\d\d\d')
match = text.search("123~123")
print(match.group())
# 123~123match = text.search("123~~~123")
print(match.group())
# 123~~~123

3.6 用花括号匹配特定次数

import retext = re.compile(r'\d\d\d(~){3,5}\d\d\d')
match = text.search("123~~~123")
print(match.group())
# 123~~~123match = text.search("123~~~~~123")
print(match.group())
# 123~~~~~123

4. 贪心和非贪心匹配

  • 贪心匹配:尽可能匹配最长的字符串
  • 非贪心匹配:尽可能匹配最短的字符串
import retext = re.compile(r'(123 ){2,4}')
match = text.search("123 123 123 123 123 ")
print(match.group())
# 123 123 123 123text = re.compile(r'(123 ){2,4}?')
match = text.search("123 123 123 123 123 ")
print(match.group())
# 123 123

5. findall() 方法

import retext = re.compile(r'\d\d\d-\d\d\d-\d\d\d')
match = text.search("~~~123-456-789~~~111-222-333~~~")
print(match.group())
# 123-456-789match = text.findall("~~~123-456-789~~~111-222-333~~~")
print(match)
# ['123-456-789', '111-222-333']

6. 字符分类

编写字符分类表示
\d0~9的任何数字
\D除0~9的数字以外的任何字符
\w任何字母、数字和下划线字符
\W除字母、数字和下划线以外的任何字符
\s空格、制表符或换行符
\S除空格、制表符和换行符以外的任何字符

7. 建立自己的字符分类

import retext = re.compile(r'[0-5]')
match = text.findall("1a2b3c4d")
print(match)
# ['1', '2', '3', '4']text = re.compile(r'[abc]')
match = text.findall("1a2b3c4d")
print(match)
# ['a', 'b', 'c']text = re.compile(r'[^abc]')
match = text.findall("1a2b3c4d")
print(match)
# ['1', '2', '3', '4', 'd']

8. 插入字符和美元字符

  • ^ :以指定文本开始
  • $ :以指定文本结束
import retext = re.compile(r'^\d\d\d')
match = text.search("123abc456")
print(match)
# <re.Match object; span=(0, 3), match='123'>text = re.compile(r'\d\d\d$')
match = text.search("123abc456")
print(match)
# <re.Match object; span=(6, 9), match='456'>

9. 通配字符

  • . :匹配换行符之外的所有字符
import retext = re.compile(r'..23')
match = text.findall("123abc23")
print(match)
# ['bc23']

9.1 用点-星匹配所有字符

import retext = re.compile(r'123(.*)456(.*)')
match = text.findall("123abc456def")
print(match)
# [('abc', 'def')]

9.2 用句点字符匹配换行符

  • re.DOTALL :让句点字符匹配所有字符(包括换行符)
import retext = re.compile(r'.*')
match = text.search("123abc\n456def")
print(match.group())
# 123abctext = re.compile(r'.*', re.DOTALL)
match = text.search("123abc\n456def")
print(match.group())
# 123abc\n456def

10. 不区分大小写的匹配

  • re.I :不区分大小写
import retext = re.compile(r'abc', re.I)
match = text.findall("abcABC")
print(match)
# ['abc', 'ABC']

11. 用 sub() 方法替换字符串

import retext = re.compile(r'ABC\w*')
match = text.sub("abc", "ABC : 123")
print(match)
# abc : 123

相关文章:

第7章 模式匹配与正则表达式

目录 1. 不用正则表达式来查找文本模式2. 用正则表达式来查找文本模式2.1 创建正则表达式&#xff08;Regex&#xff09;对象2.2 匹配Regex对象 3. 用正则表达式匹配更多模式3.1 利用括号分组3.2 用管道匹配多个分组3.3 用问号实现可选匹配3.4 用星号匹配零次或多次3.5 用加号匹…...

单元测试实战(三)JPA 的测试

为鼓励单元测试&#xff0c;特分门别类示例各种组件的测试代码并进行解说&#xff0c;供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战&#xff08;一&#xff09;Controller 的测试 单元测试实战&#xff08;二&#xff09;Service 的测试 单元测试实战&am…...

初刷leetcode题目(3)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…...

76基于matlab的免疫算法求解配送中心选址问题,根据配送地址确定最佳配送中心地址位置。

基于matlab的免疫算法求解配送中心选址问题&#xff0c;根据配送地址确定最佳配送中心地址位置。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 76matlab免疫算法配送中心选址 (xiaohongshu.com)...

C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑

本文涉及的基础知识点 二分查找算法合集 离线查询 题目 给你一个下标从 0 开始的正整数数组 heights &#xff0c;其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i &#xff0c;且存在 i < j 的建筑 j 满足 heights[i] < heights[j] &#xff0c;那么这个…...

建立跨层全栈的区块链安全保障系统-应用层,系统层,设施层

目录 建立跨层全栈的区块链安全保障系统 应用层 系统层 设施层...

程序员告诉你:人工智能是什么?

随着科技的快速发展&#xff0c;人工智能这个词汇已经逐渐融入了我们的日常生活。然而&#xff0c;对于大多数人来说&#xff0c;人工智能仍然是一个相对模糊的概念。 首先&#xff0c;让我们从人工智能的定义开始。人工智能是一种模拟人类智能的技术&#xff0c;它涵盖了多个领…...

飞书开发学习笔记(七)-添加机器人及发送webhook消息

飞书开发学习笔记(七)-添加机器人及发送webhook消息 一.添加飞书机器人 1.1 添加飞书机器人过程 在群的右上角点击折叠按键…选择 设置 群机器人中选择 添加机器人 选择自定义机器人&#xff0c;通过webhook发送消息 弹出的信息中有webhook地址&#xff0c;选择复制。 安…...

C/C++统计数 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C统计数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C统计数 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个数的序列S&#xff0c;以及一个区间[L, R], 求序列…...

从一到无穷大 #19 TagTree,倒排索引入手是否是优化时序数据库查询的通用方案?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 文章主旨时序数据库查询的一般流程扫描维度聚合时间聚合管控语句 TagTree整体结构索引…...

程序员带你入门人工智能

随着人工智能技术的飞速发展&#xff0c;越来越多的程序员开始关注并学习人工智能。作为程序员&#xff0c;我们可能会对如何开始了解人工智能感到困惑。今天&#xff0c;我将向大家介绍一些如何通过自学了解人工智能的经验和方法&#xff0c;帮助大家更好地入门这个充满挑战和…...

机器学习笔记 - 了解常见开源文本识别数据集以及了解如何创建用于文本识别的合成数据

一、部分开源数据集 以下是一些英文可用的开源文本识别数据集。 ICDAR 数据集:ICDAR 代表国际文档分析和识别会议。该活动每两年举行一次。他们带来了一系列塑造了研究社区的场景文本数据集。例如, ICDAR-2013和ICDAR-2015数据集。 MJSynth 数据集:该合成词数据集由牛津大…...

openssl开发详解

文章目录 一、openssl 开发环境二、openssl随机数生成三、openssl对称加密3.1 SM43.2 AES3.3 DES3.4 3DES 四、openssl非对称加密4.1 SM24.2 RSA4.3 ECC 五、openssl的hash5.1 SM35.2 md55.3 sha256 五、证书5.1 证书格式 六、openssl网络编程七、openssl调试FIDO流程 一、open…...

conda虚拟环境中安装的cuda和服务器上安装的cuda的异同

服务器上已安装Nvidia提供的cuda&#xff0c;nvcc -V时会出现已安装的CUDA版本。如下图所示&#xff0c;服务器上已安装好的cuda版本为10.1。 但是当我们在Anaconda虚拟环境下安装pytorch或者paddlepaddle等深度学习框架的GPU版本时&#xff0c;通常会选择较高版本的cuda&…...

股东入股可用的出资形式主要有哪些

股东入股&#xff0c;可用的出资形式主要包括货币以及实物、知识产权、土地使用权等可以用货币估价并可以依法转让的非货币财产。 第一&#xff0c;货币。设立公司必然需要一定数量的流动资金。以支付创建公司时的开支和启动公司运营。因此&#xff0c;股东可以用货币出资。 第…...

react中设置activeClassName的笔记

React是一种流行的JavaScript库&#xff0c;用于构建动态用户界面。它具有许多有用的组件&#xff0c;其中之一是NavLink组件。NavLink组件用于在React应用程序中创建链接&#xff0c;并且它具有许多有用的属性&#xff0c;例如选中的样式设置。 react-router-dom": “^6…...

JS原型对象prototype

让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

nodejs+vue实验室上机管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

用户&#xff1a;管理员、教师、学生 基础功能&#xff1a;管理课表、管理机房情况、预约机房预约&#xff1b;权限不同&#xff0c;预约类型不同&#xff0c;教师可选课堂预约和个人&#xff1b;课堂预约。 在实验室上机前&#xff0c;实验室管理员需要对教务处发来的上机课表…...

SpringBoot 注解开发

利用自定义注解&#xff0c;解决问题 例1 自定义注解限制请求 场景&#xff1a;前端发起的频繁的请求&#xff0c;导致服务器压力过大。需要对后端接口进行限流处理&#xff0c;每个接口都需要做限流处理的话就会导致代码冗余&#xff0c;此时就可以利用注解进行解决 非注解形…...

使用持久卷部署 WordPress 和 MySQL

&#x1f5d3;️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 &#x1f587;️创建 kustomization.yaml 你可以通过 kustomization.yaml 中的生成器创建一个 Secret存储密码或密…...

别再只盯着LSB了:用Python实战对比空间域与DCT/DWT变换域水印的鲁棒性

别再只盯着LSB了&#xff1a;用Python实战对比空间域与DCT/DWT变换域水印的鲁棒性 数字水印技术作为信息隐藏领域的重要分支&#xff0c;其核心挑战始终是如何在不可见性与抗攻击能力之间找到最佳平衡点。传统教材和理论课程往往将LSB&#xff08;最低有效位&#xff09;算法作…...

WLAN——从零到一:深度解析CAPWAP隧道建立与AP上线全流程

1. 初识CAPWAP&#xff1a;无线网络的隐形桥梁 第一次接触CAPWAP协议时&#xff0c;我盯着拓扑图上AP和AC之间的虚线发愣——这条看似简单的连接线背后&#xff0c;竟然藏着无线网络最精妙的控制逻辑。CAPWAP&#xff08;Control And Provisioning of Wireless Access Points P…...

JavaScript注释的艺术:gh_mirrors/js/js教你写出自解释代码

JavaScript注释的艺术&#xff1a;gh_mirrors/js/js教你写出自解释代码 【免费下载链接】js :art: A JavaScript Quality Guide 项目地址: https://gitcode.com/gh_mirrors/js/js 在JavaScript开发中&#xff0c;注释是代码质量的重要组成部分&#xff0c;但很多开发者误…...

让论文润色提速的秘密武器

对于每一位科研人员而言&#xff0c;将心血凝聚成论文初稿仅仅是万里长征的第一步。紧接着&#xff0c;一场更为煎熬的“拉锯战”往往在修改环节悄然打响。你是否也经历过这样的时刻&#xff1a;为了一个地道的表达&#xff0c;对着电脑屏幕逐字逐句地斟酌&#xff0c;耗费数小…...

OpenClaw更新操作

文章名称 目录文章名称前言一、OpenClaw更新26.3.31版本二、飞书更新26.3.31版本我的龙虾日记前言 OpenClaw由于每个版本都有大量内容&#xff0c;更新的时候会出很多问题。记录一下出现过的问题 一、OpenClaw更新 推荐采用重装的方式进行更新,由于会进行新手教程.如果你不想再…...

收藏备用|大模型应用演进3阶段(React/Multi-agent+Spring AI Alibaba实战)

本文详细拆解大模型应用的三大演进阶段&#xff0c;从基础组件构建、工作流编排&#xff0c;到自主Agent落地&#xff0c;重点剖析React模式与Multi-agent模式的核心逻辑及实现原理。结合Spring AI Alibaba框架&#xff0c;手把手演示Java如何快速实现简单Multi-agent框架&…...

OpenClaw批量处理:千问3.5-9B同时操作百个Excel文件

OpenClaw批量处理&#xff1a;千问3.5-9B同时操作百个Excel文件 1. 为什么需要测试Excel批量处理&#xff1f; 上个月我需要整理一批市场调研数据——237个Excel文件&#xff0c;每个文件包含20-50张工作表。手动操作需要反复执行"打开文件→复制数据→粘贴到汇总表→保…...

基于潜在扩散模型的高分辨率图像合成-CVPR2022

期刊&#xff1a;Conference on Computer Vision and Pattern Recognition (CVPR) 论文链接&#xff1a;[2112.10752] High-Resolution Image Synthesis with Latent Diffusion Models 年份&#xff1a;2022 关键词&#xff1a;扩散模型&#xff0c;图像生成 从像素空间走向…...

不只是CTF:用Kali+Pwntools+GDB-Peda搭建你的第一个漏洞分析实验台

从CTF到实战&#xff1a;构建专业级二进制漏洞分析实验环境 在安全研究领域&#xff0c;CTF比赛中的Pwn挑战只是冰山一角。真正的价值在于将这些技能应用于现实世界的漏洞分析和利用。本文将带你搭建一个专业级的本地漏洞分析实验环境&#xff0c;这个环境不仅能应对CTF题目&a…...

[GDOUCTF 2023]<ez_ze> SSTI 绕过数字与大括号过滤的实战技巧

1. SSTI注入基础与ez_ze题目背景 SSTI&#xff08;Server-Side Template Injection&#xff09;服务器端模板注入是Web安全中常见的漏洞类型&#xff0c;它允许攻击者通过构造恶意模板表达式在服务器端执行任意代码。在CTF竞赛中&#xff0c;这类题目往往通过过滤关键字符来增加…...