正则表达式(知识总结篇)

本篇文章主要是针对初学者,对正则表达式的理解、作用和应用

正则表达式🌟

    • 一、🍉正则表达式的概述
    • 二、🍉正则表达式的语法和使用
    • 三、 🍉正则表达式的常用操作符
    • 四、🍉re库主要功能函数


一、🍉正则表达式的概述

  • 通用的字符串表达框架
  • 简洁表达一组字符串的表达式
  • 针对字符串表达“简洁”和“特征”思想的工具
  • 判断某字符串的特征归属

正则表达式在文本处理中十分常用

  1. 表达式文本类型的特征(病毒、入侵等)
  2. 同时查找或替换一组字符串
  3. 匹配字符串的全部或部分

二、🍉正则表达式的语法和使用

  1. 语法:

    正则表达式语法由字符和操作符构成

P(Y|YT|YTH|YTHO)?N
  1. 使用

    编译:将符合正则表达式语法的字符串转换成正则表达式特征。

在这里插入图片描述

三、 🍉正则表达式的常用操作符

操作符说明实例
.表示任何单个字符
[ ]字符集,对单个字符给出取值范围[abc]表示a、b、c,[a-z]表示a到z单个字符
[ ^ ]非字符集,对单个字符给出排除范围[^abc]表示非a或b或c的单个字符
*前一个字符0次或无限次扩展abc*表示ab、abc、abcc、abcc等
+前一个字符1次或无限次扩展abc+表示abc、abcc、abccc等
?前一个字符0次或1次扩展abc?表示av、abc
|左右表达式任意一个abc|def表示abc、def
{m}扩展前一个字符m次ab{2}c表示abbc
{m,n}扩展前一个字符m至n次(含n)ab{1,2}c表示abc、abbc
^匹配字符串开头^abc表示abc且在一个字符串的开头
$匹配字符串结尾abc$表示abc且在一个字符串的结尾
()分组标记,内部只能使用|操作符(abc)表示abc,(abc|def)表示abc、def
\d数字,等价于[0-9]
\w单词字符,等价于[A-Za-z0-9]

四、🍉re库主要功能函数

函数说明
re.search(pattern, string)在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.match(pattern, string)从一个字符串的开始位置起匹配正则表达式,返回match对象
re.findall(pattern, string)搜索字符串,以列表类型返回全部能匹配的子串
re.split(pattern, string)将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.finditer(pattern, string)搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
re.sub(pattern, string)在一个字符串中替换所有匹配正则表达式的字串,返回替换后的字符串
re.compile(pattern[, flags])
re.escape(string)

re模块中常用函数的简单介绍:

语法:

re.函数(pattern, string,flags=0)
  • pattern:正则表达式的字符串或原生字符串表示
  • string:待匹配字符串
  • flags:正则表达式使用时的控制标记
  1. re.search(pattern, string,flags=0):
    在字符串中搜索匹配正则表达式pattern的第一个位置,返回一个匹配对象,如果没有找到匹配的,则返回None。

    import re
    match = re.search(r'\d+', 'hello 123 world')
    if match:print('找到匹配:', match.group())
    else:print('未找到匹配')
    
  2. re.match(pattern, string,flags=0):
    从字符串的起始位置匹配正则表达式pattern,如果起始位置没有匹配到,则返回None。注意这与search()不同,search()会扫描整个字符串以查找匹配项。

    match = re.match(r'\d+', '123 hello world')
    if match:print('找到匹配:', match.group())
    else:print('未找到匹配')
    
  3. re.findall(pattern, string):
    返回字符串中所有与正则表达式pattern相匹配的所有非重叠匹配项的列表。如果未找到匹配项,则返回空列表。

    matches = re.findall(r'\b\w+\b', 'Hello World! This is a test.')
    print(matches)
    # 输出:['Hello', 'World', 'This', 'is', 'a', 'test']
    
  4. re.sub(pattern, repl, string, count=0, flags):
    将字符串中所有与正则表达式pattern匹配的部分替换为repl,并返回修改后的字符串。count参数可以指定替换的最大次数,默认为0,表示替换所有匹配项。

    result = re.sub(r'\d+', 'NUMBER', 'hello 123 world 456')
    print(result)
    # 输出:'hello NUMBER world NUMBER'
    
  5. re.compile(pattern[, flags]):
    编译正则表达式字符串为一个正则表达式对象,这样可以提高使用相同模式进行多次匹配的效率。

    pattern = re.compile(r'\d+')
    match = pattern.match('123 hello')
    if match:print('找到匹配:', match.group())
    
  6. re.escape(string):
    转义字符串中的特殊字符,使得它们在正则表达式中作为字面值字符对待。

    pattern = re.compile(re.escape('[') + r'\d+' + re.escape(']'))
    match = pattern.search('[123]')
    if match:print('找到匹配:', match.group())
    
  7. re.split(pattern,string,maxsplit=0,flags=0):

    将一个字符串按照正则表达式匹配进行分割返回列表类型

    • maxsplit:最大分割数,剩余部分作为最后一个元素输出
    import re
    result1=re.split(r'[1-9]\d{5}','BIT100081 TSU100084')
    print(result1)
    result2=re.split(r'[1-9]\d{5}','BIT100081 TSU100084',maxsplit=1)
    print(result2)
    
  8. re.finditer(pattern, string):

    搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是,match对象

    import re
    for m in re.finditer(r'[1-9]\d{5}','BIT100081 TSU100084'):if m:print(m.group(0))
    

拓展:

  1. re库的另一种等价用法:
# 第一种 函数式用法:一次性操作
rst=re.search(r'[1-9]\d{5}','BIT 100081')
# 第二种 面对对象用法:编译后的多次操作
pat=ree.compile(r'[1-9]\d{5}')
rst=pat.search('BIT 100081')
  1. match对象介绍

    Match对象一次匹配的结果,包含匹配的很多信息

    import re
    match=re.search(r'[1-9]\d{5}','BIT 100081')
    if match:print(match.group(0))print(type(match))
    

    match对象的属性:

    属性说明
    .string待匹配的文本
    .re匹配时使用的patter对象(正则表达式)
    .pos正则表达式搜索文本的开始位置
    .endpos正则表达式搜索文本的结束位置

    match对象的方法:

    方法说明
    .group(0)获得匹配的字符串
    .start()匹配字符串在原始字符串的开始位置
    .end()匹配字符串在原始字符串的结束位置
    .span()返回(.start(),.end())
    import re
    match=re.search(r'[1-9]\d{5}','BIT100081 TSU100084')
    print(match.string)
    print(match.re)
    print(match.pos)
    print(match.endpos)
    print(match.group(0))
    print(match.start())
    print(match.end())
    print(match.span())
    
  2. 贪婪匹配

    Re默认采用贪婪匹配,即输出匹配最长的字串

    import re
    match=re.search(r'PY.*N','PYANBNCNDN')
    print(match.group(0))
    

    最小匹配:如何输出最短的子串呢?

    import re
    match=re.search(r'PY.*?N','PYANBNCNDN')
    print(match.group(0))
    

    最小匹配操作符

    操作符说明
    *?前一个字符0次或无限次扩展,最小匹配
    +?前一个字符1次或无限次扩展,最小匹配
    ??前一个字符0次或1次扩展,最小匹配
    {m,n}?扩展前一个字符m至n次(含n),最小匹配
  3. 典型例子:

    在Python中,可以使用re模块(正则表达式模块)来匹配IP地址。一个基本的IPv4地址由四个0到255之间的数字组成,每部分之间用点(“.”)分隔。下面是一个简单的例子,展示了如何编写一个正则表达式来匹配这样的IP地址:

import redef is_valid_ip(ip):# 定义IP地址的正则表达式ip_pattern = re.compile(r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$')# 使用正则表达式匹配IP地址if ip_pattern.match(ip):return Trueelse:return Falseif __name__ == '__main__':# 测试函数ips = ["192.168.1.1", "255.255.255.255", "123.456.789.0", "1.2.3"]for ip in ips:print(f"{ip}: {is_valid_ip(ip)}")

这段代码首先导入了re模块,并定义了一个函数is_valid_ip,该函数使用一个正则表达式来检查输入的字符串是否符合IPv4地址的格式。正则表达式的详细解释如下:

  • ^:表示字符串的开始。
  • ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}:这部分匹配前三部分的数字,每部分数字范围是0到255,后面跟着一个点(“.”)。其中,
    • 25[0-5] 匹配从250到255的数字,
    • 2[0-4][0-9] 匹配从200到249的数字,
    • [01]?[0-9][0-9]? 匹配0到199的数字,包括前导零的情况。
    • \. 表示匹配点字符本身(因为点在正则表达式中有特殊含义,所以需要用反斜杠转义)。
  • (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$:这部分匹配第四部分的数字,后面跟上字符串的结束标志$

经典正则表达式实例:

表达式解释
^ [A - Za-z]+$由26个字母组成的字符串
^ [A-Za-Z0-9]+$由26个字母和数字组成的字符串
^- ? \d+$整数形式的字符串
^ [0-9] * [1-9] [0-9] * $正整数形式的字符串
[1-9] \d{5}中国境内邮政编码,6位
[\u4e00-\u9fa5]匹配中文字符
\d{3}-d{8}|\d{4}-\d{7}国内电话号码,010-68913536

在这里插入图片描述

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

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

相关文章

远动通讯屏柜的组成及各装置的作用

远动通讯屏柜的组成及各装置的作用 远动通讯屏是基于公共电网安全而投入的远方监控遥控设备;主要由远动装置、通讯管理机、交换机、调制解调器、GPS对时装置、数字通道防雷器、模拟通道防雷器、插线板、空气开关、屏柜及附件等设备组成、标配尺寸2260*800*600&…

C++设计模式---面向对象原则

面向对象设计原则 原则的目的:高内聚,低耦合 1. 单一职责原则 类的职责单一,对外只提供一种功能,而引起类变化的原因都应该只有一个。 2. 开闭原则 对扩展开放,对修改关闭;增加功能是通过增加代码来实现的&…

【linux特殊符号】

文章目录 学习目标一、Linux的特殊符号1.系统变量2.引号 总结 学习目标 1.学会查看系统变量 2.学会各种引号 3.一、Linux的特殊符号 1.系统变量 windows系统变量:echo %path% linux系统变量:echo $PATH2.引号 " " 双引号,换行…

如何基于springboot构建cas最新版源码?

环境准备 下载JDK21 https://download.oracle.com/java/21/archive/jdk-21.0.2_windows-x64_bin.zip下载gradle 8.5并配置环境变量 https://gradle.org/next-steps/?version8.5&formatbin下载项目git clone http://gitlab.ruishan.cc/meta/anka-authentication.git 开始…

web前端项目已有阿里巴巴图标基础上,再次导入阿里巴巴图标的方法

如果是第一次导入阿里巴巴图标请参考: vue项目引入阿里云图标_vue引用阿里云图标fontclass-CSDN博客 本文主要想讲在项目原有阿里巴巴图标基础上,再次导入阿里巴巴图标的解决办法: 1.iconfont.json对应修改就行,这个简单一看就明白; 2.iconfont.js主要改动<symbol><…

Ansible自动化运维中的file文件模块模块应用详解

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月21日15点21分 &#x1f4af;趣站推荐&#x1f4af; 前些天发现了一个巨牛的&#x1f916;人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xf…

【Java笔记】第8章:面向对象的三大特性(封装、继承、多态)

前言1. 三大特性概述2. 封装3. 继承4. 多态结语 #include<GUIQU.h> int main { 上期回顾:【Java笔记】第7章&#xff1a;面向对象 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;【Java学习】 return 一键三连; } 前言 各位小伙伴大家好&#xff01;上期小编给大家…

网络工程师备考1——基础学习

认识设备 1 交换机 一、什么是交换机&#xff1f; 实现不同电脑之间数据的转发 换机是一种用于电(光)信号转发的网络设备。 它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。交换机工作于OSI参考模型的第二层&#xff0c;即数据…

使用 Supabase 的 Realtime + Storage 非常方便呢

文章目录 &#xff08;一&#xff09;Supabase&#xff08;二&#xff09;Realtime&#xff08;消息&#xff09;&#xff08;2.1&#xff09;Python 消息订阅&#xff08;2.2&#xff09;JavaScript 消息订阅 &#xff08;三&#xff09;Storage&#xff08;存储&#xff09;&…

Linux:Ubuntu修改root密码

Linux&#xff1a;Ubuntu修改root密码 修改默认grub配置文件 rootshanxin:~# vim /etc/default/grub# 主要修改内容如下&#xff1a;GRUB_DEFAULT0 #GRUB_TIMEOUT_STYLEhidden 注释这一行 GRUB_TIMEOUT5 # 将这一行的时间改为5秒进行开启启动的grub文件的复写 rootshanxin:~…

芯课堂 | UI Creator 物理键盘移植指南

LVGL提供输入设备的种类一共有5种&#xff0c;分别是&#xff1a;touchpad&#xff08;触摸板&#xff09;、mouse&#xff08;鼠标&#xff09;、keypad&#xff08;键盘&#xff09;、encoder&#xff08;编码器&#xff09;、button&#xff08;外部按键&#xff09;。而基于…

如何成为一个专业的AI产品经理?

可以找专业的老师带。 可以找专业的内容学。 可以多遇挫折并快速学习&#xff0c;屡败屡战&#xff0c;笔者本人从业AI十年有余&#xff0c;吃了不少苦&#xff0c;有过很多或成功或失败的经历。 成为一个专业的AI产品经理需要一系列专业知识和技能的积累&#xff0c;以及在…

基于Matlab卷积神经网络(CNN)人脸识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 人脸识别技术作为计算机视觉领域的一个重要分支&#xff0c;已经广泛应用于安全监控、身份验证…

FreeRTOS学习——FreeRTOS队列(下)之队列创建

本篇文章记录我学习FreeRTOS队列创建的知识。主要分享队列创建需要使用的初始化函数、队列复位函数。 需要进一步了解FreeRTOS队列的相关知识&#xff0c;读者可以参考以下文章&#xff1a; FreeRTOS学习——FreeRTOS队列&#xff08;上&#xff09;_freertos 单元素队列-CSDN博…

【hackmyvm】Slowman靶机

文章目录 主机探测端口探测FTP匿名登录 目录探测hydra爆破mysql爆破zip------fcrackzip爆破密码-----john提权 主机探测 ┌──(root㉿kali)-[/home/kali] └─# fping -ag 192.168.9.1/24 2>/dev/null 192.168.9.221 主机192.168.9.224 靶机端口探测 ┌──(roo…

【教程】Linux 安装 kkFileView 文档在线预览项目 及优化

【教程】Linux 安装 kkFileView 文档在线预览项目 官网 kkFileView - 在线文件预览 (keking.cn) 安装包 可以直接下载成品 也可以下载source 源码 自己编译 kkFileView 发行版 - Gitee.com 打开IDEA 然后先clear 再install 然后在 file-online-preview\server\target 目录…

WordPress插件Disable WP REST API,可根据是否登录来禁用REST API

前面跟大家分享了代码版禁用WordPress REST API的方法&#xff08;详见『WordPress4.7以上版本如何禁用JSON REST API&#xff1f;』&#xff09;&#xff0c;不过有些站长不太敢折腾自己的网站代码&#xff0c;那么建议试试这款Disable WP REST API&#xff0c;它可以&#xf…

小结5:朗读练习第二段

五、朗读练习2 2024-5-6始&#xff0c;5-14终&#xff0c;5-15写。 我渐渐体会到一些朗读的乐趣。但我还要考研&#xff0c;要写作业、期末考试。如果是在大一该多好。我可以就这样一天一天的写下去&#xff0c;慢慢地有一些自己的作品&#xff0c;还能录视频发到b站上。 上一篇…

通过修改物理内存实现跨进程内存读写

习一下利用修改物理内存来跨进程内存读写 系统&#xff1a;win10 21h1 x64 编译环境: vs2022 详情见附录 基础 虚拟地址转物理地址 虚拟地址也称线性地址&#xff0c;一个线性地址进程的DirBase地址可以转换成物理地址。先来看线性地址的含义 在x64体系中只实现了48位的virtu…

刷题之从前序遍历与中序遍历序列构造二叉树(leetcode)

从前序遍历与中序遍历序列构造二叉树 前序遍历&#xff1a;中左右 中序遍历&#xff1a;左中右 前序遍历的第一个数必定为根节点&#xff0c;再到中序遍历中找到该数&#xff0c;数的左边是左子树&#xff0c;右边是右子树&#xff0c;进行递归即可。 #include<vector>…