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

news2024/11/18 1:29:03

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

正则表达式🌟

    • 一、🍉正则表达式的概述
    • 二、🍉正则表达式的语法和使用
    • 三、 🍉正则表达式的常用操作符
    • 四、🍉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 re

def 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 True
    else:
        return False
    
if __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.coloradmin.cn/o/1687811.html

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

相关文章

【设计模式】JAVA Design Patterns——Balking(止步模式)

🔍目的 止步模式用于防止对象在不完整或不合适的状态下执行某些代码。 🔍解释 真实世界例子 洗衣机中有一个开始按钮,用于启动衣物洗涤。当洗衣机处于非活动状态时,按钮将按预期工作,但是如果已经在洗涤,则…

从零到一:手把手教你将项目部署上线-环境准备

部署步骤 引言1.Java环境配置2.ngnix安装好书推荐 引言 将自己的项目从本地开发环境顺利部署上线,是每个开发者必经的里程碑。今天,我们就从零开始,一步一步教你如何将手中的项目部署到线上,让全世界见证你的创造力。 首先&#x…

3D 高斯泼溅(Gaussian Splatting)-3D重建的3DGS时代

3D重建自从NeRfs出现之后又热闹了一次,3D GS技术一时间燃变了整个三维重建和Slam领域,几个月不见,沧海桑田。 NeRF貌似已成为过去式,三维重建进入了3DGS时代,且3DGS在各方面比NeRF落地更快。3D 高斯泼溅(S…

Payload SDK dji

开发硬件 感谢您的耐心等待,建议您可以考虑下树莓派4B或Jetson Nano开发板,看您需求选择,OSDK即将停止服务,我们建议您使用PSDK来进行开发,PSDK包含了OSDK的功能。Payload SDK 感谢您对大疆产品的支持!祝…

DOS学习-目录与文件应用操作经典案例-type

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 1. 查看文本文件内容 2. 同时查看多个文本文件内容 3. 合并文…

获取日期区间的所有日期

借助moment.js 转换指定格式,首先安装npm install moment --save methods:{enumerateDaysBetweenDates(startDate, endDate) { // 假定你已经保证了startDate 小于endDate,且二者不相等let daysList [];let SDate this.$moment(startDate);let EDate …

CentOS7安装内网穿透实现远程推送镜像到本地Docker Registry

文章目录 前言1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址 前言 本文主要介绍如何部署Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现…

顶顶通实时质检系统-黑名单拦截功能配置流程

文章目录 前言联系我们配置流程一、黑名单导入二、白名单导入三、外部黑名单四、靓号规则五、创建拦截规则六、拦截条件七、功能配置 拦截记录与统计拦截记录拦截统计 前言 上篇文章讲解了顶顶通实时质检系统黑名单的功能介绍,本篇文章主要讲解顶顶通黑名单拦截功能…

C++入门:从C语言到C++的过渡(1)

目录 1.什么是C 2.C的标准库 3.命名空间 3.1为什么要存在命名空间 3.2命名空间的定义 3.3命名空间的使用 3.3.1域作用限定符 3.3.2using关键字引入某个成员 3.3.3using关键字引入命名空间名称 3.4命名空间的嵌套 3.5命名空间的合并 4.C中的输入与输出 1.什么是C C&am…

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

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

jmeter线程组(下篇)

线程组 线程组作为JMeter测试计划的核心组件之一,对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口,所有的取样器和控制器必须放置在线程组下。 可以将线程组视为一个虚拟用户池,其中每个线程可被理解为一个虚拟用户&#x…

记录一次IDEA升级版本导致Lombok注解失效问题

IDEA升级导致Lombok注解失效问题 环境 我本机项目原来的运行环境和软件版本: IDEA 2021JDK 1.8Maven 3.5.4springboot 2.2.6.RELEASEspring-cloud Hoxton.SR9 为了体验更好我就把IDEA版本从2021.2升级到了2024.1版本,反正现在是有最新版本我就一直在…

SpringBoot2.0.x旧版集成Swagger UI报错Unable to infer base url...解决办法

一、问题描述 1.1项目背景 SpringBoot2.0.9的旧版项目维护开发,集成Swagger-ui2.9.2无法访问的问题。不用想啊,这种老项目是各种过滤器拦截器的配置,访问不到,肯定是它们在作妖。懂得都懂啊,这里交给大家一个排错的办…

企业防泄密软件有哪些,哪个排名最好

机密数据的泄密对于企业而言,已成为最大的信息安全威胁之一。近年来企业面对的最大威胁来自于内部,以利益为出发点的互联网信息犯罪及案件,在世界各地不断传出,因此,信息保护与管控将逐渐成为企业信息安全重点部署项目…

解决arduino安装stm32duino开发板库时下载慢下载不了的问题

解决arduino安装stm32duino开发板库时下载慢下载不了的问题,安装其他开发板也可以使用类似的方法。 在利用arduino进行stm32开发的时候,需要安装对stm32开发板支持的库,但是正常情况下,由于网络问题,安装的时候容易出…

双边滤波去雾算法

目录 1. 简介 2. 步骤 3. 优点 4. 代码 5. 运行结果 1. 简介 本文介绍了双边滤波图像去雾算法,旨在消除雾霾对图像质量的影响,能够保留边缘信息并去除噪声,有效提高图像的清晰度和对比度。双边滤波(Bilateral Filtering&…

【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署

【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署 SaaS 模式的云 HIS 更适用于基层医疗机构,而传统的 HIS 已经在大中型医疗机构大规模应用。过去,国内的大中型医疗机构投入了大量的资金来进行信息化系统建设…

esp32(8266)如何在platformio中上传文件到单片机

本来认为这是基础内容,不用我来介绍,结果,在个人的单片机字库开源项目 GitHub - StarCompute/tftziku: 这是一个通过单片机在各种屏幕上显示中文的解决方案 中有两个人问到了,就特别来说明一下: 在platformio中新建一…

指针数组与数组指针的理解

typedef struct vexnode {int key;struct arcnode *next; }vexnode, adjlist[MVNUM]; void init(adjlist *list); void init(adjlist *list) {for(size_t i 0; i < MVNUM; i){list[i].key i;list[i].next NULL;} }上述代码编译的时候没有报错&#xff0c;但是运行的时候&…

爱因斯坦CG大揭秘:从“纸片人”到“数字巨星”

AMV BBDO和Smart Energy GB携手&#xff0c;他们不仅是为了推广一个产品&#xff0c;更是为了传达一种理念。他们委托了业界翘楚The Mill&#xff0c;以精湛的技术与创意&#xff0c;打造了一个超越现实的数字形象——爱因斯坦。 这个逼真的CG形象&#xff0c;不仅是对科学巨匠…