python的re正则表达式

华子目录

  • 什么是正则表达式
  • 元字符
  • 字符集
    • 字符集与元字符的综合使用
  • 数量规则
  • 指定匹配次数
  • 边界处理
  • 分组匹配
  • 贪婪匹配
  • 非贪婪匹配
  • re.S
  • 转移字符
  • re.search()
  • re.sub()
  • 实例
  • 常见的匹配模式

什么是正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。是对字符串操作的一种逻辑公式,就是用事先定义好的一些特殊字符及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种逻辑过滤。

re.match()   从字符串的起始位置开始匹配,如果起始位置匹配不成功,就返回一个None
re..findall()  在字符串中找到正则表达式所要匹配的所有子串,并返回一个列表
re.search()  扫描整个字符串并返回第一个成功的匹配
re.sub()  替换整个字符串中每一个匹配的字符

match函数参数说明:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

元字符

匹配单个字符

.表示匹配任意一个字符(默认不包含\n)
import re
print(re.match('.','wed'))
print(re.match('..','wed'))
print(re.match('.','web').group())  # group()提取匹配成功的字符/字符串
<re.Match object; span=(0, 1), match='w'>
<re.Match object; span=(0, 2), match='we'>
w
\d 表示0-9之间的任意一个数字
import re
print(re.match('\d\d','12fde'))  
print(re.match('.\d','w2fs'))  
print(re.findall('\d','we2e34'))  
<re.Match object; span=(0, 2), match='12'>
<re.Match object; span=(0, 2), match='w2'>
['2', '3', '4']
\D 表示非数字
print(re.match('\D','w2ed'))
<re.Match object; span=(0, 1), match='w'>
\s   只能匹配空白字符(空格,\n,\t)
\S   表示非空白字符(非空格,非\n,非\t)
\w   表示匹配数字,字母,下划线
\W   表示非数字,字母,下划线

字符集

只能匹配单个字符,使用[]来表示,表示一个字符的范围。
注:还是匹配一个字符,第一个字符开始匹配看是不是再这个范围内,如果不在,就返回None

import re
print(re.match('[tyer]','er'))
print(re.findall('[erty]','hfseryt'))
print(re.findall('[a-z]','zabc'))
print(re.findall('[A-z]','ghahaAFG'))
print(re.findall('[0-9]','0973khg382'))
print(re.findall('[0-9A-z]','sg34'))
<re.Match object; span=(0, 1), match='e'>
['e', 'r', 'y', 't']
['z', 'a', 'b', 'c']
['g', 'h', 'a', 'h', 'a', 'A', 'F', 'G']
['0', '9', '7', '3', '3', '8', '2']
['s', 'g', '3', '4']
^  取反,写在字符集里面
print(re.match('[^a-z]','fgs'))
print(re.findall('[^a-z]','ABG'))
None
['A', 'B', 'G']

字符集与元字符的综合使用

print(re.match('[\d\D]','f2f'))
print(re.match('[\w\W][\w\W]','f2f'))
<re.Match object; span=(0, 1), match='f'>
<re.Match object; span=(0, 2), match='f2'>

数量规则

* 匹配前一个字符的任意次数,包括0次
print(re.match('\d*','13289446832'))
print(re.match('\w*','1328944yut6832'))
<re.Match object; span=(0, 11), match='13289446832'>
<re.Match object; span=(0, 14), match='1328944yut6832'>
+ 匹配前一个字符,重复匹配1次以上,0次不行,只要出现1次以上就匹配
print(re.match('\w+','123fs45'))
<re.Match object; span=(0, 7), match='123fs45'>
? 匹配前一个字符出现0次或者1次,只能匹配一个
print(re.match('\d?','a1234'))
print(re.match('\d?','1234'))
<re.Match object; span=(0, 0), match=''>
<re.Match object; span=(0, 1), match='1'>

指定匹配次数

{m} 匹配前一个字符的m次
{m,} 至少匹配m次以上
{m,n} 匹配m次以上,n次以下
print(re.match('\d{3}','1234567'))
print(re.match('\d{3,}','1234567'))
print(re.match('\d{3,6}','1234567'))
<re.Match object; span=(0, 3), match='123'>
<re.Match object; span=(0, 7), match='1234567'>
<re.Match object; span=(0, 6), match='123456'>

边界处理

注:做完边界处理的正则表达式的匹配次数必须与字符串的长度相等,否则会返回None

^ 边界开始
$ 边界结束

实例

匹配电话号码
第一位[1]
第二位[358]
第三位[56789]
后八位任意
print(re.match('^1[358][5-9]\d{8}$','13589446832'))
print(re.match('^1[358][5-9]\d{8}$','135894468aa'))
<re.Match object; span=(0, 11), match='13589446832'>
None

分组匹配

|  或者
() 分组
t = '2022-12-30'
print(re.match('(\d{4})-(0[1-9]|1[0-2])-([0-2][0-9]|3[01])', t))
print(re.match('(\d{4})-(0[1-9]|1[0-2])-([0-2][0-9]|3[01])',t).group(0))
print(re.match('(\d{4})-(0[1-9]|1[0-2])-([0-2][0-9]|3[01])',t).group(1))
print(re.match('(\d{4})-(0[1-9]|1[0-2])-([0-2][0-9]|3[01])',t).group(2))
print(re.match('(\d{4})-(0[1-9]|1[0-2])-([0-2][0-9]|3[01])',t).group(3))
<re.Match object; span=(0, 10), match='2022-12-30'>
2022-12-30  # 取所有
2022   # 取第一组
12   # 取第二组
30   # 取第三组

贪婪匹配

尽可能多的去匹配

import re
# 匹配尽可能多的字符
content = 'Hello 1234567 World_This is a Regex Demo'

result = re.match('^He.*(\d+)\s.*Demo$', content)  
print(result)
print(result.group(1)) 
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
7

非贪婪匹配

尽可能少的去匹配

import re
# 匹配尽可能少的字符
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$', content)

print(result)
print(result.group(1))
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
1234567

re.S

匹配包括换行在内的所有字符,多数用于有多行数据时,用re.S会更方便

import re
content = """
Hello 1234567 World_This 
is a Regex Demo
"""
result = re.match('^\nHe.*?(\d+).*Demo$', content, re.S)
print(result)
print(result.group())
print(result.group(1))

<re.Match object; span=(0, 42), match='\nHello 1234567 World_This \nis a Regex Demo'>

Hello 1234567 World_This 
is a Regex Demo
1234567

转移字符

import re

content = 'price is $5.00' 
result = re.match('price\sis\s$5.00', content)
print(result)
None
import re

# \表示转义,加在特殊字符的前面,表示它不是正则里的匹配符号,而是普通文本
content = 'price is $5.00'
result = re.match('price\sis\s\$5\.00', content)
print(result)
print(result.group())
<re.Match object; span=(0, 14), match='price is $5.00'>
price is $5.00

re.search()

扫描整个字符串并返回第一个成功匹配的字符串

import re

content = 'Extroa stings Hello 1234567 World_This is a 66666666 RDemogex Demo Extra stings'

result = re.search('He.*?(\d+).*?Wor.*?s$', content)
print(result)
print(result.group(1))
<re.Match object; span=(14, 79), match='Hello 1234567 World_This is a 66666666 RDemogex D>
1234567

re.sub()

替换字符串中每一个匹配的字符,返回替换后的字符串

import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
# 第一个参数 正则表达式
# 第二个参数 :要替换的新字符
# 第三个参数:原字符串
content = re.sub('s', '7', content) 
print(content)
Extra 7ting7 Hello 1234567 World_Thi7 i7 a Regex Demo Extra 7ting7
import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('\d+', '666', content)
print(content)
Extra stings Hello 666 World_This is a Regex Demo Extra stings

实例

import re
#写的很简洁
content = 'Hello 123 4567 World_Thixs is a Regex'
result = re.match('He.*?Regex',content)#把一整个文本匹配完成 又不想写的复杂,

print(result.group()) # 获取匹配内容
print(result.span()) # 获取匹配长度
Hello 123 4567 World_Thixs is a Regex
(0, 37)

常见的匹配模式

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SPSS时间序列模型预测

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

Python 如何实现 Strategy 策略设计模式?什么是 Strategy 策略设计模式?

策略模式&#xff08;Strategy Design Pattern&#xff09;是一种对象行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并使得这些算法可以相互替换&#xff0c;使得客户端代码可以独立于算法的变化而变化。策略模式属于对象行为模式。 主要角色&#xff1a; 策略接口…

抖音小程序定制开发: 解锁创意,打造独特互动体验

随着抖音平台的崛起&#xff0c;抖音小程序定制开发成为数字创新的关键领域之一。本文将探讨如何通过定制开发&#xff0c;实现独特功能和个性化设计&#xff0c;为用户带来全新的互动体验。 1. 环境搭建 在开始抖音小程序的定制开发之前&#xff0c;首先需要搭建开发环境。…

UBoot

uboot是什么&#xff1f; 嵌入式linux系统启动过程 嵌入式系统上电后先执行uboot、然后uboot负责初始化DDR&#xff0c;初始化Flash&#xff0c;然后将OS从Flash中读取到DDR中&#xff0c;然后启动OS&#xff08;OS启动后uboot就无用了&#xff09;uboot是什么&#xff0c;ubo…

【LeetCode刷题笔记】二叉树(一)

102. 二叉树的层序遍历 解题思路: 1. BFS广度优先遍历 ,使用队列,按层访问 解题思路: 2. 前序遍历 , 递归 ,在递归方法参数中,将 层索引

网银转账虚拟生成器在线制作,工商农业邮政建设招商,标签+对话框+画板+快照实现

标签对话框画板快照实现就实现了一个虚拟截图生成器&#xff0c;当然我加了水印了&#xff0c;这个图片你根本盗用不了&#xff0c;图片模版的话网上真的太多了&#xff0c;我这个也是网上找的&#xff0c;自己百度图库搜一下&#xff0c;然后标签记得一定用黑月的透明标签&…

Word转PDF简单示例,分别在windows和centos中完成转换

概述 本篇博客以简单的示例代码分别在Windows和Linux环境下完成Word转PDF的文档转换。 文章提供SpringBoot Vue3的示例代码。 文章为什么要分为Windows和Linux环境&#xff1f; 因为在如下提供的Windows后端示例代码中使用documents4j库做转换&#xff0c;此库需要调用命令行…

如何制作一个有吸引力的电商小程序

随着互联网的快速发展&#xff0c;电商行业也在不断壮大&#xff0c;越来越多的商家开始进入电商领域。在这个竞争激烈的市场中&#xff0c;一个有吸引力的电商小程序能够为商家带来巨大的优势。那么&#xff0c;如何制作一个有吸引力的电商小程序呢&#xff1f;下面我们将以乔…

2023nacos源码解读第2集——nacos-server的启动

nacos 是一个典型的server-client中间件&#xff0c;server这里安装最新的nacos-server 2.3.0-BETA版本 1.docker启动nacos-server 镜像详情参考nacos-docker项目的readme &#xff0c;很方便&#xff0c;但是官方提供的nacos-server镜像往往可能滞后&#xff0c;且不便于后续…

【Git】第一篇:Git安装(centos)

git查看安装版本 以我自己的centos7.6为例&#xff0c;我们可以输入以下指令查看自己是否安装了git. git --version安装了的话就会显示自己安装的版本。 git 安装 安装很简单&#xff0c;一条命令即可 sudo yum install git -ygit 卸载 sudo yum remove git -y

本地生活直播的下个红利期来了!虚拟直播遇上本地生活擦出新火花

近年来&#xff0c;本地生活直播发展迅猛&#xff0c;作为一种全新的线下实体店营销方式&#xff0c;它比电商直播更贴近消费者的生活需求。比如消费者通过直播购买套餐或消费券&#xff0c;并在实体店核销。这种情况就可以归属于本地生活直播的服务范围。因此&#xff0c;对于…

基于SpringBoot+Vue的高校心理教育管理系统

基于SpringBootVue的高校心理教育管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 测试列表 测试结果 用户界面 管理员界面 摘要 本文设计并实现了一款…

【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法

在前端的舞台上&#xff0c;属性操作是我们与HTML元素进行互动的关键步骤之一。而JQuery&#xff0c;这位前端开发的巫师&#xff0c;通过简洁而强大的语法&#xff0c;为我们提供了便捷的属性操作工具。在这篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的属性操作&…

【时间复杂度和空间复杂度】

文章目录 前言时间复杂度大O的渐进表示法推导大O阶方法练习 空间复杂度练习 前言 衡量算法的效率分为两种情况&#xff1a; 1.时间复杂度 2.空间复杂度 时间复杂度 含义&#xff1a;算法中的基本操作的执行次数&#xff0c;为算法的时间复杂度 大O的渐进表示法 计算时间复…

网络安全专用产品有哪些?能一一列举出来吗?

网络安全专用产品是专门为网络安全设计的防护产品。那你知道网络安全专用产品有哪些&#xff1f;这里我们小编就给大家汇总了一下&#xff0c;仅供参考哈&#xff01; 网络安全专用产品有哪些&#xff1f; 1、数据备份与恢复产品 2、防火墙 3、入侵检测系统 4、入侵防御系统…

IDEA 2023搭建 SpringMVC +FreeMarker+JDBC

1.IDEA的版本&#xff0c;目前最新是2023&#xff0c;要选择旗舰版。笔者曾选择社区版&#xff0c;发现少了很多功能。只能重新安装。 2.安装好以后的第1件事&#xff0c;是设置Maven&#xff0c;并将下载地址改为淘定站&#xff0c;参照这篇一次包会——最新IDEA配置Maven指南…

网络渗透测试(被动扫描)

被动扫描 主要是指的是在目标无法察觉的情况下进行信息搜集。在Google上进行人名的搜素就是一次被动扫描。最经典的被动扫描技术就是"Google Hacking"技术。由于Google退出中国&#xff0c;暂时无法使用。在此介绍三个优秀的信息搜集工具 被动扫描范围 1.企业网络…

Redis应用之二分布式锁2

一、前言 前一篇 Redis应用之二分布式锁 我们介绍了使用SETNX来实现分布式锁&#xff0c;并且还遗留了一个Bug&#xff0c;今天我们对代码进行优化&#xff0c;然后介绍一下Redisson以及数据库的乐观锁悲观锁怎么用。 二、SetNX分布式锁优化后代码 RedisService.java Inven…

Python数据容器之[列表]

Python数据容器 Python中的数据容器&#xff1a; 一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素 每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否支…