Python正则表达式(一)

news2025/4/21 19:27:07

目录

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

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 re

def 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 re

def 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 re

def 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 re

a = "scy.{2}scy"

b = "scyascyscyabscybbdkkjscy8yscy"

for i in re.finditer(a , b) :
    print(i.group() , i.span())

输出:

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

6、迭代器

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

下面是一个错误的例子:

import re

a = "scy.{2}scy"

b = "scyascyscyabscybbdkkjscy8yscy"

c = re.finditer(a , b)
print(c.group() , c.span())

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

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

import re

a = "scy.{2}scy"

b = "scyascyscyabscybbdkkjscy8yscy"

for i in re.finditer(a , b) :
     print(i)

结果:

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

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

7、re.sub()函数

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

基本格式:

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

例子:

import re

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

输出:

四、边界符号

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

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

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

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

五、分组

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

例子:

import re

zs = "(((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 re

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

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

结果:

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

例子:

import re

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

输出:

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

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

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

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

相关文章

【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…

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 豆包智能…

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

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

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

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

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

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

golang Error的一些坑

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

【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 Ⅱ、相对位置…

在普通用户下修改root用户密码

1 从普通用户切换到root用户 sudo -s 再输入密码。 2 输入passwd ,会提醒你输入当前用户密码&#xff0c;验证后会提醒你输入root用户密码。 3 切换到root用户&#xff0c;使用修改过的密码登陆。 4 成功进入root用户。

SPPAS安装及问题汇总

SPPAS下载地址 文件找不到&#xff0c;可能是MAC的自动化操作问题&#xff0c;解决方案有二&#xff1a; 方案一&#xff1a; 直接查看SPPAS中的readme&#xff0c;运行sppas.command 方案二&#xff1a; 在自动化脚本中添加 export PATH/usr/local/bin:$PATH

LINUX基础 [三] - 进程创建

目录 前言 进程创建的初次了解&#xff08;创建进程的原理&#xff09; 什么是fork函数&#xff1f; 初识fork函数 写时拷贝 fork函数存在的意义 fork调用失败的原因 进程终止 运行完毕结果不正确 main函数返回 库函数函数exit 系统调用接口_exit 进程异常终止 进…

【day1】数据结构刷题 链表

一 反转链表 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]…