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正则表达式(一)的全部内容:)

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

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

相关文章

ArayTS:一个功能强大的 TypeScript 工具库

目录 ArayTS:一个功能强大的 TypeScript 工具库🚀 主要特性1. 数据结构与算法2. 实用工具函数3. 类型工具4. 数据验证5. 字符串处理6. 数组处理7. 对象处理8. 样式处理9. 随机数生成10. 文件处理 💡💡💡除此之外&#…

【质量管理】防错(POKA-YOKE)的概念、特点和作用解析

什么是防错法? 防错法(日语发音为PO-ka yo-KAY)是指运用某种机制或设备,帮助设备操作员(或任何人)避免犯错。在日语中,“poka-yoke” 意为 “防错” 或 “预防疏忽性错误”,最初被称…

【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)

大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言认识雪花ID…

HarmonyOS NEXT——【鸿蒙原生应用加载Web页面】

鸿蒙客户端加载Web页面: 在鸿蒙原生应用中,我们需要使用前端页面做混合开发,方法之一是使用Web组件直接加载前端页面,其中WebView提供了一系列相关的方法适配鸿蒙原生与web之间的使用。 效果 web页面展示: Column()…

Spring Data审计利器:@LastModifiedDate详解!!!

🕒 Spring Data审计利器:LastModifiedDate详解🔥 🌟 简介 在数据驱动的应用中,记录数据的最后修改时间是常见需求。Spring Data的LastModifiedDate注解让这一过程自动化成为可能!本篇带你掌握它的核心用法…

循环神经网络(RNN)

循环神经网络(RNN) 循环神经网络(Recurrent Neural Network,简称 RNN)是一类用于处理序列数据的神经网络模型。与传统的前馈神经网络(如多层感知机)不同,RNN 具有反馈结构&#xff…

iOS rootless无根越狱检测方案

不同于安卓的开源生态,iOS一直秉承着安全性更高的闭源生态,系统中的硬件、软件和服务会经过严格审核和测试,来保障安全性与稳定性。 据FairGurd观察,虽然iOS系统具备一定的安全性,但并非没有漏洞,如市面上…

【React】基于 React+Tailwind 的 EmojiPicker 选择器组件

1.背景 React 写一个 EmojiPicker 组件,基于 emoji-mart 组件二次封装。支持添加自定义背景 、Emoji 图标选择!并在页面上展示! 2.技术栈 emoji-mart/data 、emoji-mart : emoji 图标库、元数据 tailwindcss: 原子化 CSS 样式库 antd : 组…

skynet.socket.limit 使用详解

目录 核心作用方法定义使用场景场景 1:限制接收缓冲区(防御大包攻击)场景 2:动态调整限制(应对不同负载) 底层机制注意事项完整示例:带流量控制的 Echo 服务总结 在 Skynet 框架中,s…

electron打包vue2项目流程

1,安装一个node vue2 的项目 2,安装electron: npm install electron -g//如果安装还是 特比慢 或 不想安装cnpn 淘宝镜像查看是否安装成功:electron -v 3,进入到项目目录:cd electron-demo 进入项目目录…

【面试八股】:常见的锁策略

常见的锁策略 synchronized (标准库的锁不够你用了)锁策略和 Java 不强相关,其他语言涉及到锁,也有这样的锁策略。 1. 悲观锁,乐观锁(描述的加锁时遇到的场景) 悲观锁:预测接下来…

【数据分享】基于联合国城市化程度框架的全球城市边界数据集(免费获取/Shp格式)

在全球城市化进程不断加快的今天,如何精准定义和测量“城市”成为关键问题。不同国家和机构采用不同的标准,导致全球城市化水平的统计结果存在较大差异。同时,由于数据来源分散、标准不统一,获取一套完整、可比的全球城市边界数据…

acwing 每日一题4888. 领导者

目录 题目简述: 思路梳理: 总代码: https://www.acwing.com/problem/content/description/4891/ 题目简述: 有两个品种的奶牛,分别为G和H,我们要在每个品种中各找一头牛当领导者,最后输出全…

在Windows下VSCodeSSH远程登录到Ubuntu

Window用VSCode通过SSH远程登录Ubuntu SSH 服务开启Windows远程登录 SSH 服务开启 首先要确保 Ubuntu 的 SSH 服务开启了,开启 Ubuntu 的 SSH 服务以后我们就可以在 Windwos 下使用终端软件登陆到 Ubuntu 开启 SSH sudo apt-get install openssh-serverWindows远…

软件性能测试中的“假阳性”陷阱

软件性能测试中的“假阳性”陷阱主要表现为错误警报频繁、资源浪费严重、测试可信度降低。其中,错误警报频繁是最常见且最严重的问题之一,“假阳性”现象会导致开发团队在解决不存在的问题上花费大量时间。据行业调查显示,超过30%的性能优化成…

AwesomeQt分享3(含源码)

AwesomeQt 这个项目包含了多个Qt组件的使用示例,旨在展示Qt各种强大功能的实现方式。 源码分享 github: awesome_Qtgitee: 后续同步 项目进度 QCustomPlot曲线控件示例 支持排序和筛选的列表控件示例 支持排序和筛选的表格控件示例 属性表示例 Dock窗口示例 自绘…

如何验证极端工况下的系统可靠性?

验证极端工况下系统可靠性的方法主要包括设计极限测试、环境应力筛选(ESS)、可靠性预测与建模。其中,设计极限测试最为关键,通过在试验中施加超过预期使用条件的应力,可以有效评估系统的真实承受能力和潜在弱点。这类测…

[计算机网络]网络I/O模型

欢迎来到啾啾的博客🐱。 这是一个致力于构建完善的Java程序员知识体系的博客📚,记录学习的点滴,分享工作的思考、实用的技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。…

MyBaitis-Plus 使用动态表名 selectPage 不生效

在使用 MyBatis-Plus 时,采用动态表名策略后,selectPage 方法无法正常生效。 MyBatis-Plus动态表名插件配置MyBatis-Plus动态表名失效原因MyBatis-Plus动态表名失效解决办法 MyBatis-Plus动态表名插件配置 以下是我项目中 MyBatis - Plus 的插件配置&am…

C语言基础—构造类型

数据类型 1.基本类型/基础类型 整型 短整型:short[int] --2字节 基本整型:int --4字节 长整型:long[int] --32位4字节/64位8字节 长长整型:long long [int] (C99) 注意:以上类型又都分为sig…