Python学习-----模块3.0(正则表达式-->re模块)

news2024/9/23 7:27:07

目录

前言:

导入模块

 1.re.match() 函数

(1)匹配单个字符

(2)匹配多个字符

(3) 匹配开头和结尾

 2.re.search() 函数

3.re.findall() 函数

4.re.finditer() 函数

5.re.split() 函数

6.re.sub() 函数

7.re.subn() 函数


前言:

        re模块(正则表达)是Python中的重要组成部分,这里涉及到字符串的匹配,转换,自定义格式化……等等,尤其是对于后面要学的Python爬虫是经常用到的。这个模块是Python自带的,不需要pip下载,导入使用就行了。

之前我们学过了r原始字符串标识符,比如:r'123\n' 输出结果就是123\n,是表示输出原始字符串,里面的转义符就当做普通的一个字符直接输出就行了,这个也是一种正则表达方式。 

print(r'hello\n123\t')
#输出结果:hello\n123\t

导入模块

import re

 1.re.match() 函数

语法格式:re.match(pat,string,flag=0)

用法:re.match('正则表达式’,'要匹配的字符串',flag= )

参数说明

pat:是表示参与匹配的正则表达式

string:是表示要匹配的字符串

flag:是标志符,用于控制正则表达式的匹配方式(设置条件之类的)

 函数说明:

这个函数是从开头第一个字符开始匹配的,如果匹配成功的话就返回一个匹配对象,如果失败就返回none。如果我们想要获取到返回的对象就用group(num)函数来获取,这个函数获取的结果就是匹配成功的字符串,如果num为0的话,其实等效于group(),如果num为1的话就返回正则表达式第一个括号匹配成功的字符串,如果num为2的话就返回正则表达式第二个括号匹配成功的字符串

(1)匹配单个字符

字符功能位置
.匹配任意一个字符(除了\n)
[ ]

匹配[ ]中列举的字符(可以是

一个范围)

\d匹配数字,0~9可以写在[ ]中
\D

匹配非数字,除了数字以外

都可以匹配成功

可以写在[ ]中
\s匹配空白符,空格 ,Tab可以写在[ ]中
\S匹配非空白符可以写在[ ]中
\w
匹配0-9,a-z,A-Z,中文等
等除了特殊符号以外的范围
内的字符
可以写在[ ]中
\W

匹配非单词子串,除了\w范围 

以内的都可以匹配

可以写在[ ]中

 示例 

import re
string='hello word!'
pat=re.match('.',string)
print(pat)
print(pat.group())
#输出结果:<re.Match object; span=(0, 1), match='h'>  
# h

 其中第一个输出的结果就是返回的对象,span=(0,1)是表示匹配范围为字符串的第0位(区间是左闭右开),匹配成功的字符串match='h'

如果用group()去获取对象字符串就直接输出 h

示例1: 

import re
#单个匹配示例

#1.'.'号匹配
a='123hello你好'
a1=re.match('..',a)#正则表达式有两个..那么就匹配字符串a前两个字符
print(a1,a1.group())
#输出结果:<re.Match object; span=(0, 2), match='12'> 12

#2.'.'号匹配
b='garrymod555'
b1=re.match('g..r',b)
print(b1,b1.group())
#输出结果:<re.Match object; span=(0, 4), match='garr'> garr

#3.直接匹配:被匹配的字符串首字符要与正则表达式相同,大小写一一对应
c='python欧尼酱'
c1=re.match('p',c)
print(c1,c1.group())
#输出结果:<re.Match object; span=(0, 1), match='p'> p

#4.利用[],枚举匹配
d='Haolow'
d1=re.match('[hH]',d)  #这时候d 的开头大小写都可以匹配成功
print(d1,d1.group())
#输出结果:<re.Match object; span=(0, 1), match='H'> H

#利用[],枚举匹配0~9范围的数字
num='51997asd'
num1=re.match('[0123456789]',num)
print(num1,num1.group())
#输出结果:<re.Match object; span=(0, 1), match='5'> 5

#5.利用[],范围匹配
e='ikuncxk'
e1=re.match('[a-z]',e)  #[]内是表示a~z在字符范围
print(e1,e1.group())
#输出结果:<re.Match object; span=(0, 1), match='i'> i

#6.利用[],匹配多个范围
f='567hhh'
f1=re.match('[2-68-9]',f)  #这个是表示匹配2~6和8~9 范围以内的数字(字母也是同样的道理)
print(f1,f1.group())
#输出结果:<re.Match object; span=(0, 1), match='5'> 5

#7.利用\d,匹配数字(另外一个是\D,这里就不讲了,正则表达式匹配添加是跟\d完全相反的)
g='666985www'
g1=re.match('\d',g)   #
print(g1,g1.group())
#输出结果:<re.Match object; span=(0, 1), match='6'> 6

#8.利用\s,匹配空白符(跟上面一样\S,是\s反过来的,用法一样,不讲)
h='  91呵呵'
h1=re.match('\s',h)
print(h1,h1.group())
#输出结果:<re.Match object; span=(0, 1), match=' '>

#9.利用\w,匹配0-9,a-z,A-Z,中文等等除了特色符号以外的范围内的字符
i='天问1号'
i1=re.match('\w',i)
print(i1,i1.group())
#输出结果:<re.Match object; span=(0, 4), match='天问1号'> 天问1号

#10.利用\W,匹配特殊字符(\w范围以外的字符)
k='@qq.com'
k1=re.match('\W',k)
print(k1,k1.group())
#输出结果:<re.Match object; span=(0, 1), match='@'> @

 示例2:(匹配失败)

import re
kun='hellosad'
k=re.match('5',kun)
print(k)
#输出结果:None

(2)匹配多个字符

字符功能/说明位置
*

匹配前一个字符,

这个字符出现

0次到无限次(可有

可无)

可以用在

字符或者

()之后

+

匹配前一个字符,

这个字符必须出现

一次以上(否则报错)

上限为无限

可以用在

字符或者

()之后

匹配前一个字符,

这个字符出现0次

到1次

可以用在

字符或者

()之后

{m}

匹配前⼀个字符出现

m次

可以用在

字符或者

()之后

{m,n}

匹配前⼀个字符出现

从m到n次,若省略m,

则匹配0到n次,若省略n,

则匹配m到无限次;若省略

m,这匹配m,这匹配0到

n次

可以用在

字符或者

()之后

 

import re

# *  匹配多个字符
p='1112223haowww.com'
#示例1
p1=re.match('[\d]*',p)
print(p1.group())
#输出结果:1112223
#示例2
p2=re.match('1*',p)
print(p2.group())
#输出结果:111
#示例3
p3=re.match('1t*',p)
print(p3.group())  #不会报错
#输出结果:1

# + 匹配多个字符
q='aaa112python'
#示例1
q1=re.match('[a-z]+',q)
print(q1.group())
#输出结果:aaa
#示例2
q2=re.match('ai+',q)
#print(q2.group()) #报错
print(q2)
#输出结果:None

# { }综合使用
#示例1:匹配由大小写字母以及数字组成的密码
ret=re.match('[a-zA-Z0-9]{6}','321uyg88') #如果{}里面的数字大于8就会报错,超过范围了
print(ret.group()) #输出结果:321uyg
#示例2:匹配8~12为由小写字母和数字组成的密码
res=re.match('[a-z0-9]{8,12}','123520ikun')
print(res.group())#输出结果123520ikun

(3) 匹配开头和结尾

字符功能
^匹配字符串的开头
$匹配字符串的结尾

示例:

import re
#实战示例:
#我要匹配3899ojk@qq.com的QQ邮箱
emails=['3899ojk@qq.com','3899ojk@qq.comxiaolan','9554xio@qq.com']
for email in emails:
    qq=re.match('[0-9a-zA-Z]{1,10}@qq.com$',email)
    if qq:
        print('匹配成功')
    else:
        print('匹配失败')

 2.re.search() 函数

格式:

re.search('正则表达式','字符串')

说明:这个函数是从整个字符串去进行匹配的,跟re.match()不同,re.match()是从开头去匹配,如果开头不一样就返回None,而re.search()是看字符串的全局,直到匹配到满足正则表达式才返回匹配对象,如果整个字符串都没有找到匹配对象才会返回None

示例:

import re
r=re.search('wao','123waohhhq')
print(r.group())
#输出结果:wao

s=re.search('q[0-9]?j','heheqq5jbye')
print(s.group())
#输出结果:q5j

3.re.findall() 函数

格式:

re.findall('正则表达式','字符串')

说明:整个函数同样也是从整个字符串来匹配,但是这个函数是吧整个字符串所以满足正则表达式的子串以列表的形式返回(前面的函数都是返回一个对象,需要用group()函数来获取对象的子串),而这个函数是直接返回一个含有全部子串的列表

示例:

import re
ret=re.findall('\d+','123www555abc789')
print(ret)
#输出结果:['123', '555', '789']

4.re.finditer() 函数

格式:

re.finditer('正则表达式','字符串')

说明:这个函数跟re.findall() 差不多,只是前者是返回一个迭代器(需要用循环去依次获取里面的对象),而后者是返回一个列表

示例:

import re
ret=re.finditer('\d+','Python999,C++555,Java666')
print(ret) #输出的是迭代器地址
for i in ret:
    print(i.group(),end=' ')
#输出结果:<callable_iterator object at 0x000001E35504B5E0>
#         999 555 666 

5.re.split() 函数

split()整个函数在之前的字符串操作初步讲过,是一个切割函数Python学习------起步7(字符串的连接、删除、修改、查询与统计、类型判断及字符串字母大小写转换)_Python欧尼酱的博客-CSDN博客

格式:

re.split(pat,string,times)

参数说明:

pat:是正则表达式

string:是字符串

times:是分割次数

功能作用:在整个字符串中,根据匹配成功的子串作为切割点,对字符串进行切割,然后返回一个列表类型

示例: 

import re
cut=re.split('\d','hello 1 my 2 friend')
print(cut)
#输出结果:['hello ', ' my ', ' friend']

cut_1=re.split(r':| ','Jack say:"I can do this all day"') #r表示后面为原字符串
print(cut_1)
#输出结果:['Jack', 'say', '"I', 'can', 'do', 'this', 'all', 'day"']

6.re.sub() 函数

格式:

re.sub(pat,repalc,string,count,flag)

参数:

pat:是表示正则表达式

replac:是要替换的字符串(必写)

string:是匹配的字符串

count:是替换的最大次数,如果不写就默认全部替换

flag:可选参数,标志符,用于控制正则表达式的匹配条件

功能说明:sub是substitute的缩写,意思是取代,这个函数可以将匹配到的子串进行取代替换,然后返回一个字符串类型

import re
kun=re.sub('\d[A-Z]','鹜','hello,4Baww5Kc8P')
print(kun)
#输出结果:hello,鹜aww鹜c鹜


KUN=re.sub('\d[A-Z]','鹜','hello,4Baww5Kc8P',count=2)  #这里设置了count的值为2
print(KUN)
#输出结果:hello,鹜aww鹜c8P

7.re.subn() 函数

说明:这个函数的用法跟re.sub() 的用法是一样的,只是返回值不一样,这个函数的返回值是一个元组,格式:('返回的字符串','次数')

import re
def rep(temp):
    temp='GBT'
    return temp
su=re.subn('\d+',rep,'hao,w1q2d3') #不设置count,此时就是全部的替换次数
print(su)
#输出结果:('hao,wGBTqGBTdGBT', 3)

感谢各位的支持,我们下一期再见~~~

日常分享一张壁纸

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

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

相关文章

JAVA BIO,NIO,AIO区别(建议收藏)

Java中的IO原理 首先Java中的IO都是依赖操作系统内核进行的&#xff0c;我们程序中的IO读写其实调用的是操作系统内核中的read&write两大系统调用。 操作系统内核是如何进行IO交互的呢&#xff1f; 网卡中的收到经过网线传来的网络数据&#xff0c;并将网络数据写到内存…

Flink01: 基本介绍

一、什么是Flink 1. Flink是一个开源的分布式&#xff0c;高性能&#xff0c;高可用&#xff0c;准确的流处理框架 &#xff08;1&#xff09;分布式&#xff1a;表示flink程序可以运行在很多台机器上&#xff0c; &#xff08;2&#xff09;高性能&#xff1a;表示Flink处理性…

LabVIEW使用实时跟踪查看器调试多核应用程序

LabVIEW使用实时跟踪查看器调试多核应用程序随着多核CPU的推出&#xff0c;开发人员现在可以在LabVIEW的帮助下充分利用这项新技术的功能。并行编程在为多核CPU开发应用程序时提出了新的挑战&#xff0c;例如同步多个线程对共享内存的并发访问以及处理器关联。LabVIEW可自动处理…

基于SpringBoot+vue的无偿献血后台管理系统

基于SpringBootvue的无偿献血后台管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背…

基于BIM技术建设的重庆来福士广场项目

1. BIM工程应用概况 1.1 工程概况 重庆来福士广场项目位于朝天门广场与解放碑之间&#xff0c;直面长江与嘉陵江交汇口。是集大型购物中心、高端住宅、办公楼、公寓式酒店和酒店为一体的综合体项目。由于本项目钢结构体量大、结构复杂&#xff0c;混凝土标号高、强度大…

树莓派centos7.9(armv7hl)安装最新版宝塔linux面板 2023-0219

内存卡或usb存储器容量建议不小于16GB 1.启用 EPEL 软件源 树莓派安装centos7.9(armv7hl)以及宝塔linux面板. 2023-2-16_mklpo147的博客-CSDN博客 2.使用gcc-6 树莓派centos7.9(armv7hl)安装并切换GCC-6版本. 2023-2-18_mklpo147的博客-CSDN博客 3.更新系统 yum install -y e…

第1讲-初步认识数据库系统(测试题总结)

一、测试题 数据库系统 包含 数据库管理系统 详细版&#xff1a; 数据库管理系统DBMS是数据管理软件&#xff0c;在用户和操作系统之间。 数据库系统DBS由数据库&#xff0c;数据库管理系统&#xff08;及其应用开发工具&#xff09;、应用程序和数据库管理员DBA组成的存储、管…

使用51单片机的GPIO输出占空比可调节的PWM波

一、前言 在一些单片机或微控制器中&#xff0c;通用GPIO可以被配置为产生PWM信号。PWM即脉冲宽度调制&#xff0c;是一种用于模拟输出的技术。它可以通过改变输出信号的脉冲宽度来控制电路中的电平&#xff0c;从而实现对电路的控制。 二、什么是PWM波&#xff1f; PWM波&a…

JavaSE-线程池(5)- 建议使用的方式

JavaSE-线程池&#xff08;5&#xff09;- 建议使用的方式 虽然JDK Executors 工具类提供了默认的创建线程池的方法&#xff0c;但一般建议自定义线程池参数&#xff0c;下面是阿里巴巴开发手册给出的理由&#xff1a; 另外Spring也提供了线程池的实现&#xff0c;比如 Thread…

Flink02:Flink快速上手(Streaming WorldCount)

一、Flink快速上手 使用 &#xff08;1&#xff09;先把Flink的开发环境配置好。 &#xff08;2&#xff09;创建maven项目&#xff1a;db_flink &#xff08;3&#xff09;首先在model中将scala依赖添加进来。 &#xff08;4&#xff09;然后创建scala目录&#xff0c;因为针…

Lesson5---NumPy科学计算库

5.1 多维数组 Python拥有出色的第三方库生态系统在机器学习中&#xff0c;需要把所有的输入数据&#xff0c;都转变为多为数组的形式。score[i, j]二维数组i,j都从0开始 score[5] [85, 72, 61, 92, 80] score[2,5] [[85, 72, 61, 92, 80],[85, 72, 61, 92, 80]] score[30,5…

Linux系统之iptables应用SNAT与DNAT

目录 SNAT 一.SNAT的原理介绍 1.应用环境 2.SNAT原理 3.SNAT转换前提条件 二.开启SNAT 1.临时打开 2.永久打开 三.SNAT的转换 1.固定的公网IP地址 2.非固定的公网IP地址(共享动态IP地址) 四.SNAT实验 1.实验环境准备 2.配置web服务器&#xff08;192.168.100.100…

测试3.测试方法的分类

3.测试分类 系统测试包括回归测试和冒烟测试 回归测试&#xff1a;修改了旧的代码后&#xff0c;重新测试功能是否正确&#xff0c;有没有引入新的错误或导致其它代码产生错误 冒烟测试&#xff1a;目的是确认软件基本功能正常&#xff0c;可以进行后续的正式测试工作 按是否…

什么是 RESTful 风格?

一、什么是 REST &#xff1f; REST即表述性状态传递&#xff08;英文&#xff1a;Representational State Transfer&#xff0c;简称REST&#xff09;是Roy Thomas Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式&#…

游戏开发 - 开发流程 - 收集

1.应用场景 主要用于了解&#xff0c;掌握游戏开发的整个流程。 2.学习/操作 1.文档阅读 复习课 | 带你梳理客户端开发的三个重点-极客时间 2.整理输出 2.1 游戏开发流程 -- 参考 按照游戏开发中的三大模块策划、程序、美术&#xff0c;画了一个图。 开发游戏的时候&#xff…

LeetCode171-Excel表列序号(进制转换问题)

LeetCode171-Excel表列序号1、问题描述2、解题思路&#xff1a;进制转换3、代码实现1、问题描述 给你一个字符串columnTitle,表示Excel表格中得列名称。返回该列名称对应得列序号。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 …

linux shell 入门学习笔记3 shebang

shebang 计算机程序中&#xff0c;shebang指的是出现在文本文件的第一行前两个字符#! 在Unix系统中&#xff0c;程序会分析shebang后面的内容&#xff0c;作为解释器的指令&#xff0c;例如 以#!/bin/sh 开头的文件&#xff0c;程序在执行的时候会调用/bin/sh&#xff0c;也就…

[软件工程导论(第六版)]第5章 总体设计(复习笔记)

文章目录5.1 设计过程5.2 设计原理5.2.1 模块化5.2.2 抽象5.2.3 逐步求精5.2.4 信息隐藏和局部化5.2.5 模块独立5.3 启发规则5.4 描绘软件结构的图形工具5.4.1 层次图5.4.2 HIPO图5.4.3 结构图5.5 面向数据流的设计方法目的 总体设计的基本目的就是回答“概括地说&#xff0c;系…

2.19 索引和事务

一.联合查询面试问题:聚合查询与联合查询的区别聚合查询是行与行之间的数据加工聚合函数 :count,sum,avg...group by 进行分组,指定列的值,相同的记录合并到同一个组,每个组又可以分别进行聚合查询分组还可以指定条件筛选,如果分组之前指定条件 用where,如果对分组之后指定条件…

< CSDN周赛解析:第 28 期 >

CSDN周赛解析&#xff1a;第 27 期&#x1f449; 第一题&#xff1a; 小Q的鲜榨柠檬汁> 题目解析> 解决方案&#x1f449; 第二题&#xff1a; 三而竭> 解析> 解决方案> 拓展知识&#x1f449; 第三题&#xff1a; 隧道逃生> 解析> 解决方案&#x1f449;…