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

Python正则表达式(一)

目录

一、正则表达式的基本概念

1、基本概念

2、正则表达式的特殊字符

二、范围符号和量词

1、范围符号

2、匹配汉字

3、量词

三、正则表达式函数

1、使用正则表达式:

2、re.match()函数

3、re.search()函数

4、findall()函数

5、re.finditer()函数

6、迭代器

7、re.sub()函数

四、边界符号

五、分组


在Python的正则表达式中,我们可以用它来判断某个字符串是否符合某种模式,比如判断某个字符串是不是邮箱地址,是不是电话号码等,我们可以利用正则表达式在文本中寻找并抽取符合某种模式或格式

一、正则表达式的基本概念

1、基本概念

正则表达式是一个某些字符拥有一些特殊含义字符串

下面我们介绍几个有特殊含义的功能字符:

字符组合匹配模式
.除了\n外的任意一个字符,包括汉字(多行匹配可能也包含\n)
*量词,表示其左边的字符可出现0次或任意多次(包括一次)
量词,表示其左边的字符必须出现一次或0次
+量词,表示其左边的字符必须出现一次或更多次
{ m }量词,m是整数,表示其左边的字符必须且只能出现m次
{ m,n }量词,m和n都是整数,表示左边的字符至少出现m次,至多n次(n也可以不写,表示没有上限
\d一个数字字符,等价于[0 , 9]
\D一个非数字字符,等价于[^\d] , [^0 , 9]
\s一个空白字符,如空格,\t , \r , \n
\S一个非空白字符
\w一个单词字符,包括汉字或大小写的英文字母,数字,下划线,或其他语言的
\W一个非单词符
|A | B,表示能匹配A或能匹配B均算能匹配

(注:上述这些组合是两个独立的字符,单纯的在字符串里面输出的话无效果,需结合相关的正则表达式函数!)

2、正则表达式的特殊字符

我们在正则表达式中常见的特殊字符有以下几个

.  +  ?  *  $  [  ]  (  )  ^  {  }  \  

如果要在正则表达式中使用上述这些字符本身,我们在前面加上\符号

(注:和刚刚上面一样,这些特殊字符加\符号只是两个独立的字符,本身无特殊含义,如果只是在字符串中输出,无效果,需结合正则表达式使用

二、范围符号和量词

1、范围符号

在正则表达式中我们的范围符号用[]来表达,这个符号的意思是此处必须出现一个中括号内的所指定的范围的字符

相关用法:

例子用法含义
[abc]此处需匹配a,b,c中的一个字符
[a-zA-Z]匹配任意英文字母
[\da-z\$]匹配一个数字或任意一个小写字母,或字符$
[^abc]匹配一个字符,但不能是abc中的一个
[^a-k5-9]

匹配一个字符,但不能是a到k中的一个,或者不能是5

到9中的一个

2、匹配汉字

汉字的Unicode编码范围是 4e00 - 9fa5 (16进制)因此[4e00 - 9fa5]就是表示一个汉字

3、量词

量词的使用十分灵活,我们可以把量词和上面提到的特殊字符结合起来,达到更加细致的匹配条件:

比如,我们可以把 . 和 + 结合起来,“ . ”代表任意字符(除了\n),而+表示出现或多次(出现的字符不见得需要一样),结合起来就代表着匹配任意长度不为0且不包含\n的字符串

我们还可以在前面加上负号,来表示数字的范围:

正整数:[1-9]\d*(数字的最前面不能是0,所以先规定1-9,然后的\d是一个0-9的数字,再加一个*就是说这个\d可以出现0次或多次)

负整数:-[1-9]\d*(前面加一个负号即可)

整数:-?[1-9]\d* | 0(?表示可能出现一次或0次,涵盖了正负整数,再用|符号加一个0,就是全部整数)

三、正则表达式函数

1、使用正则表达式:

我们如果想要使用正则表达式,需要先调用re包

import re

2、re.match()函数

re.match()函数的格式:

re.match(pattern , string , flags = 0)

①从字符串string的起始位置匹配对应的正则表达式pattern

②flags是标志位,用于控制模式串的匹配方式,比如,是否区分大小写,多行匹配等,例子:re.M | re.I就是忽略大小写,且多行匹配

③成功就返回一个匹配对象,否则返回None

下面我们来看一个例子:

import redef match(pattern , string) :x = re.match(pattern , string)if x != None :print(x.group())    #group()是返回匹配到的字符串else :print(None)match("scy" , "scymimimi")  #符合要求match("scy" , "mimiscymimi")    #虽然包含scy,但是不是在开头match(".{3}scy" , "miscyabdc")  #要求scy的左边必须包含三个字符,但是string中只有两个

输出:

3、re.search()函数

re.search()函数的格式:

re.search(pattern , string , flags = 0)

①查找字符串中,可以匹配成功的子串

②成功就返回一个匹配对象,否则返回None

我们把上面的代码稍加修改:

import redef matchtwo(pattern , string) :x = re.search(pattern , string)if x != None :print(x.group())    #group()是返回匹配到的字符串else :print(None)matchtwo("scy" , "scymimimi")  #符合要求matchtwo("scy" , "mimiscymimi")    #只要能在后面的string中找到符合规则的即可matchtwo(".{3}scy" , "miscyabdc")  #要求scy的左边必须包含三个字符,但是string中只有两个,虽然能找到scy这个子串,但是不符合其他的条件

结果:

因为这是在整个字符串中找到符合要求的子串,如果我们的string十分的长,我们可以添加一个函数来使得查找更方便:x.span()

润色后的代码(只包含函数部分):

def matchtwo(pattern , string) :x = re.search(pattern , string)if x != None :print(x.group() , x.span())    #group()是返回匹配到的字符串   x.span()是输出其子串的起止位置else :print(None)

结果:

4、findall()函数

在前面两个函数中,无论是哪一个函数,都是只找了第一个符合目标的子串,就返回了结果,如果我们想要找到全部符合要求的子串,就可以使用findall()函数:

re.findall()函数的格式:

re.findall(pattern , string , flags = 0)

对其目标字符串string中的所有和模式匹配的子串,不重叠的放入一个列表,一个子串都找不到就返回空列表[]

import redef findall(pattern , string) :x = re.findall(pattern , string)print(x)findall("scy" , "abcd")findall("scy" , "scy")findall("scy" , "abcscy")findall("scy" , "abcscydefscy")findall("scy.{2}scy" , "scyascyscyabscybbdkkjscy8yscy")

5、re.finditer()函数

re.finditer()函数的格式:

re.finditer(pattern , string , flags = 0)

查找字符串中每个符合匹配对象的子串(不重叠),每个子串对应一个匹配对象,返回匹配对象的序列(可调用迭代器)

(迭代器:迭代器是一个根据具体参数来进行抽象操作的行为,比如我们我一篮子水果,我们想把每个水果拿出来检查以下,而迭代器就相当于水果分发器,把水果取出来,交给你)

例子:

import rea = "scy.{2}scy"b = "scyascyscyabscybbdkkjscy8yscy"for i in re.finditer(a , b) :print(i.group() , i.span())

输出:

(如果发现没有符合要求的子串,就无输出)

6、迭代器

关于迭代器,迭代器是没有group和span函数的,所以我们如果直接把finditer函数返回的东西和group函数结合使用是会报错的!

下面是一个错误的例子:

import rea = "scy.{2}scy"b = "scyascyscyabscybbdkkjscy8yscy"c = re.finditer(a , b)
print(c.group() , c.span())

这个代码会报错,因为代码中的c,是指finditer函数返回的迭代器本身,无法使用group函数,而上面正确的例子中那个i,因为在循环之中,每次循环i都会指向迭代器内一个新的且符合要求的匹配对象,对象中包含子串的一些信息!

我们上面那个正确的例子稍加修改:

import rea = "scy.{2}scy"b = "scyascyscyabscybbdkkjscy8yscy"for i in re.finditer(a , b) :print(i)

结果:

这个代码就是生成迭代器中每个符合要求的匹配对象,然后里面包含子串及相关信息

这些符合要求的匹配对象的集合,把他放到一个容器中,就是迭代器!

7、re.sub()函数

re.sub()函数用于把目标子串替换成我们所要替换的内容:

基本格式:

re.sub(模式串,替换串,母串)

例子:

import restr = "adhba8bkwjciehwajbjhsduagbshuchaobcsdjk"
a = re.sub("a.b" , "00000" , str)
print(a)

输出:

四、边界符号

边界符号用于指定字符的位置

我们下面会介绍几个边界符号:
 

边界符号作用
\A表示字符串的左边界,及要求从此处往左不能有任何字符
\Z表示字符串的右边界,及要求从此处往右不能有任何字符
^与\A同,但多行匹配下还可以表示一行文字的左边界
$与\Z同,但多行匹配下还可以表示一行文字的右边界
\b表示此处是单词的左边界或右边界,即不可是单词字符
\B表示此处不能是单词的左边界或右边界,即必须是单词字符

边界字符和上面那些范围符号一样,都只是一个或两个单独的字符不是和\n一样是一个字符

五、分组

分组是正则表达式中很重要的一个概念,我们在Python的正则表达式中会用()来表达,一个括号的表达式是一个分组,多个分组按左括号,从左到右的顺序从1开始编号

例子:

import rezs = "(((abc*)d)e)"
str = "abcdefgh"
a = re.match(zs , str)
print(a.group())
print(a.group(0))    #group(0)等价于group()
print(a.group(1))
print(a.group(2))
print(a.group(3))
print(a.groups())

输出:

我们可以在分组的右面通过分组的编号来引用该分组匹配的字符串:

import rezs = r"(((abc*)d)e)\3"
str = "abcdeabccccfgh"
a = re.match(zs , str)
print(a.group())

这里的\3引用的就是(abc*),而(abc*)在前面得到是abc,所以\3就是abc

结果:

分组作为一个整体,后面可以跟量词

例子:

import rezs = r"(((abc*)+d)e)"
str = "abcabcabcabcdecfgh"
a = re.match(zs , str)
print(a.group())

输出:

(上述这些代码如果没有遇到能匹配的子串,就会报错,建议放到try里面)

以上就是Python正则表达式(一)的全部内容:)

相关文章:

Python正则表达式(一)

目录 一、正则表达式的基本概念 1、基本概念 2、正则表达式的特殊字符 二、范围符号和量词 1、范围符号 2、匹配汉字 3、量词 三、正则表达式函数 1、使用正则表达式: 2、re.match()函数 3、re.search()函数 4、findall()函数 5、re.finditer()函数 6…...

【TI MSPM0】PWM学习

一、样例展示 #include "ti_msp_dl_config.h"int main(void) {SYSCFG_DL_init();DL_TimerG_startCounter(PWM_0_INST);while (1) {__WFI();} } TimerG0输出一对边缘对齐的PWM信号 TimerG0会输出一对62.5Hz的边缘对齐的PWM信号在PA12和PA13引脚上,PA12被…...

MySQL: 创建两个关联的表,用联表sql创建一个新表

MySQL: 创建两个关联的表 建表思路 USERS 表:包含用户的基本信息,像 ID、NAME、EMAIL 等。v_card 表:存有虚拟卡的相关信息,如 type 和 amount。关联字段:USERS 表的 V_CARD 字段和 v_card 表的 v_card 字段用于建立…...

更改 vscode ! + table 默认生成的 html 初始化模板

vscode ! 快速成的 html 代码默认为&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…...

使用LVS的 NAT 模式实现 3 台RS的轮询访问

节点规划 1、配置RS RS的网络配置为NAT模式&#xff0c;三台RS的网关配置为192.168.10.8 1.1配置RS1 1.1.1修改主机名和IP地址 [rootlocalhost ~]# hostnamectl hostname rs1 [rootlocalhost ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.10.7/24…...

R 基础语法

R 基础语法 引言 R 是一种针对统计计算和图形表示而设计的编程语言和环境。它广泛应用于统计学、生物信息学、数据挖掘等领域。本文将为您介绍 R 语言的基础语法,帮助您快速上手。 R 的基本结构 R 语言的基本结构包括:变量、数据类型、运算符、控制结构、函数等。 变量 …...

MySQL实战(尚硅谷)

要求 代码 # 准备数据 CREATE DATABASE IF NOT EXISTS company;USE company;CREATE TABLE IF NOT EXISTS employees(employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT );DESC employees;CREATE TABLE IF NOT EXISTS departments…...

华为p10 plus 鸿蒙2.0降级emui9.1.0.228

需要用到的工具 HiSuite Proxy V3 华为手机助手11.0.0.530_ove或者11.0.0.630_ove应该都可以。 官方的通道已关闭&#xff0c;所以要用代理&#xff0c;127.0.0.1端口7777 https://www.firmfinder.ml/ https://professorjtj.github.io/v2/ https://hisubway.online/articl…...

C# Modbus RTU学习记录

继C# Modbus TCP/IP学习记录后&#xff0c;尝试串口通信。 操作步骤&#xff1a; 1.使用Visual Studio安装Nuget包NModbus.Serial。 2.使用Modbus Slave应用程序&#xff0c;工具栏Connection项&#xff0c;单击Connect&#xff0c;弹窗Connection Setup&#xff0c;修改Con…...

AI+Xmind自动生成测试用例(思维导图格式)

一、操作步骤: 步骤1:创建自动生成测试用例智能体 方式:使用通义千问/豆包智能体生成,以下两个是我已经训练好的智能体,直接打开使用即可 通义智能体: https://lxblog.com/qianwen/share?shareId=b0cd664d-5001-42f0-b494-adc98934aba5&type=agentCard 豆包智能…...

单片机 - 位运算详解(``、`|`、`~`、`^`、`>>`、`<<`)

单片机中的位运算详解&#xff08;&、|、~、^、>>、<<&#xff09; 位运算是单片机编程&#xff08;C/C&#xff09;中经常使用的技巧&#xff0c;用于高效地操作寄存器、I/O 端口和数据。以下是各位运算符的详细解析&#xff0c;并结合单片机实际应用举例。 …...

chrome插件开发之API解析-chrome.tabs.query

chrome.tabs.query 是 Chrome 扩展开发中用于查询浏览器标签页信息的 API。它允许你根据指定的条件获取当前浏览器中所有匹配的标签页。这个 API 返回一个 Promise&#xff0c;解析后会得到一个包含匹配标签页信息的数组。 常见用途 获取当前活动标签页&#xff1a;可以获取当…...

(二)手眼标定——概述+原理+常用方法汇总+代码实战(C++)

一、手眼标定简述 手眼标定的目的&#xff1a;让机械臂和相机关联&#xff0c;相机充当机械臂的”眼睛“&#xff0c;最终实现指哪打哪 相机的使用前提首先需要进行相机标定&#xff0c;可以参考博文&#xff1a;&#xff08;一&#xff09;相机标定——四大坐标系的介绍、对…...

3D点云的深度学习网络分类(按照作用分类)

1. 3D目标检测&#xff08;Object Detection&#xff09; 用于在点云中识别和定位目标&#xff0c;输出3D边界框&#xff08;Bounding Box&#xff09;。 &#x1f539; 方法类别&#xff1a; 单阶段&#xff08;Single-stage&#xff09;&#xff1a;直接预测3D目标位置&am…...

【Linux网络-NAT、代理服务、内网穿透】

一、NAT技术 1.NAT技术背景 之前我们讨论了&#xff0c;IPV4协议中&#xff0c;IP地址数量不充足的问题 NAT技术当前解决IP地址不够用的主要手段&#xff0c;是路由器的一个重要功能 NAT&#xff08;网络地址转换&#xff0c;Network Address Translation&#xff09;是一种…...

Windows 和 Linux 操作系统架构对比以及交叉编译

操作系统与架构兼容性详解 1. 可执行文件格式&#xff1a;PE vs ELF Windows: PE (Portable Executable) 格式 详细解释&#xff1a; PE 格式是 Windows 下的可执行文件标准 包含多个区段&#xff08;Sections&#xff09;&#xff0c;如代码段、数据段、资源段 文件头包含…...

heapq库的使用——python代码

Python中heapq库的基础使用方法和示例代码&#xff0c;包含详细注释说明&#xff1a; 1. 基本功能 heapq 实现的是最小堆&#xff08;父节点值 ≤ 子节点值&#xff09;&#xff0c;核心操作包括&#xff1a; 插入元素&#xff1a;heappush(heap, item)弹出最小值&#xff1a…...

新手村:逻辑回归-理解02:逻辑回归中的伯努利分布

新手村&#xff1a;逻辑回归-理解02&#xff1a;逻辑回归中的伯努利分布 伯努利分布在逻辑回归中的潜在含义及其与后续推导的因果关系 1. 伯努利分布作为逻辑回归的理论基础 ⭐️ 逻辑回归的核心目标是: 建模二分类问题中 目标变量 y y y 的概率分布。 伯努利分布&#xff08…...

golang Error的一些坑

golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计&#xff0c;而有一些坑会导致我们的程序发生一些与我们预期不符的问题&#xff0c;开发过程中需要注意。 ​​ errors.Is​判断error是否Wrap不符合预期 ​…...

【干货,实战经验】nginx缓存问题

文章目录 案例背景出现的问题:定位到问题解决方式修改配置修改后的nginx配置 案例背景 有2个服务器A 和B&#xff0c;A是一个动态ip经常变公网ip&#xff0c;B是一个云服务器&#xff0c;公网ip固定. 于是我通过ddns &#xff0c;找了个域名C&#xff0c;动态解析A服务器上的公…...

分布式理论:CAPBASE理论

1 CAP理论 1.1 简介 CAP也就是Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;、Partition Tolenrance&#xff08;分区容错性&#xff09;这三个单词首字母组合。 在理论计算机科学中&#xff0c;CAP定理&#xff08;CAP theorem&…...

大数据学习(86)-Zookeeper去中心化调度

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

uniapp再次封装uni-nav-bar导航栏组件

<!-- components/custom-nav-bar/custom-nav-bar.vue --> <template><view class"custom-nav" :style"{ backgroundColor: bgColor }"><!-- 状态栏占位 --><view class"status-bar" :style"{ height: statusBar…...

ngx_http_index_t

定义在 src\http\modules\ngx_http_index_module.c typedef struct {ngx_str_t name;ngx_array_t *lengths;ngx_array_t *values; } ngx_http_index_t; 该结构体用于 存储和解析 index 指令中单个索引文件的信息 &#xff0c;支持静态…...

深入解析Flink Kafka Connector的分布式流数据采集架构与底层实现

目录 1. Flink Kafka连接器的分布式流采集架构 1.1 架构组成 1.2 分布式流模型 2. 数据分区分配策略 3. 为什么重写序列化和偏移量管理 3.1 与Flink分布式架构集成 3.2 与Flink检查点机制集成同时承接多级并行架构 3.3 OffsetsInitializer与细粒度偏移量控制 3.4 与Fl…...

vcd波形转仿真激励

我们使用vivado的ila抓取波形后&#xff0c;常常希望用该波形作为激励参与仿真。稍微复杂的项目中手动输入的工作量巨大&#xff0c;几乎是不可能采取的方式。我的方法是保存ila波形为vcd格式文件&#xff0c;用python解析vcd文件&#xff0c;转换成仿真激励的代码。 python代码…...

【STM32】知识点介绍二:GPIO引脚介绍

文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、…...

【AI】NLP

不定期更新&#xff0c;建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…...

Go 代理爬虫

现在注册&#xff0c;还送15美金注册奖励金 --- 亮数据-网络IP代理及全网数据一站式服务商 使用代理服务器&#xff0c;通过 Colly、Goquery、Selenium 进行网络爬虫的基础示例程序 本仓库包含两个分支&#xff1a; basic 分支包含供 Go Proxy Servers 这篇文章改动的基础代码…...

【NLP 43、大模型技术发展】

目录 一、ELMo 2018 训练目标 二、GPT-1 2018 训练目标 三、BERT 2018 训练目标 四、Ernie —— baidu 2019 五、Ernie —— Tsinghua 2019 六、GPT-2 2019 七、UNILM 2019 八、Transformer - XL & XLNet 2019 1.模型结构 Ⅰ、循环机制 Recurrence Mechanism Ⅱ、相对位置…...