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 recontent = '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 recontent = '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 recontent = '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 recontent = '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.mzph.cn/news/141035.shtml

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

相关文章

macOS Big Sur(macos11版本)

macOS Big Sur是苹果推出的最新操作系统&#xff0c;具有以下特点&#xff1a; 全新的设计风格&#xff1a;Big Sur采用了全新的设计语言&#xff0c;包括更加圆润的窗口和控件、更加鲜明的色彩和更加简洁的界面。这种设计风格使得操作系统更加美观和易用。强大的性能表现&…

基于RK3399的室内健身魔镜方案

I 方案背景 一、健身魔镜的兴起 2020年疫情席卷全球&#xff0c;宅家是防疫的措施之一&#xff0c;因而宅家运动火爆&#xff0c;随之而来的宅家运动器材也风靡起来&#xff0c;其中包含既有颜值又具有多种功能的健身魔镜。 Ⅱ 方案介绍 一、健身魔镜的方案介绍 …

windows安装nginx

一、下载安装Nginx 1、官网下载地址&#xff1a;nginx: download 2、下载教程&#xff1a;选择最新的Stable version&#xff08;稳定版本&#xff09;下载到本地 3、下载完成后&#xff0c;解压放入本地非中文的文件夹中&#xff1a; 4、启动nginx&#xff1a;切勿直接双击n…

php的api接口token简单实现

<?php // 生成 Token function generateToken() {$token bin2hex(random_bytes(16)); // 使用随机字节生成 tokenreturn $token; } // 存储 Token&#xff08;这里使用一个全局变量来模拟存储&#xff09; $tokens []; // 验证 Token function validateToken($token) {gl…

Webpack--动态 import 原理及源码分析

前言 在平时的开发中&#xff0c;我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import()&#xff0c;那 webpack 是如何实现 import() polyfill 的&#xff1f; 原理分析 我们先来看看下面的 demo function component() {const btn docume…

浅谈泛在电力物联网在智能配电系统应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;在社会经济和科学技术不断发展中&#xff0c;配电网实现了角色转变&#xff0c;传统的单向供电服务形式已经被双向能流服务形式取代&#xff0c;社会多样化的用电需求也得以有效满足。随着物联网技术的发展&am…

USB偏好设置-Android13

USB偏好设置 1、USB偏好设置界面和入口2、USB功能设置2.1 USB功能对应模式2.2 点击设置2.3 广播监听刷新 3、日志开关3.1 Evet日志3.2 代码中日志开关3.3 关键日志 4、异常 1、USB偏好设置界面和入口 设置》已连接的设备》USB packages/apps/Settings/src/com/android/setting…

Java 设计模式——享元模式

目录 1.概述2.结构3.实现3.1.抽象享元3.2.具体享元3.3.享元工厂3.4.测试 4.优缺点5.使用场景6.JDK 源码解析——Integer 类 1.概述 &#xff08;1&#xff09;享元模式 (Flyweight Pattern) 是一种结构型设计模式&#xff0c;主要通过共享对象来减少系统中的对象数量&#xff…

MUYUCMS v2.1:一款开源、轻量级的内容管理系统基于Thinkphp开发

MuYuCMS&#xff1a;一款基于Thinkphp开发的轻量级开源内容管理系统&#xff0c;为企业、个人站长提供快速建站解决方案。它具有以下的环境要求&#xff1a; 支持系统&#xff1a;Windows/Linux/Mac WEB服务器&#xff1a;Apache/Nginx/ISS PHP版本&#xff1a;php > 5.6 (…

达梦数据库答案

1、 创建数据库实例&#xff0c;到/dm8/data下&#xff0c;数据库名&#xff1a;DEMO&#xff0c;实例名DEMOSERVER&#xff08;10分&#xff09; [dmdbadmServer ~]$ cd /dm8/tool [dmdbadmServer tool]$ ./dbca.sh1、 簇大小32&#xff0c;页大小16&#xff0c;登录密码&…

挑战100天 AI In LeetCode Day08(热题+面试经典150题)

挑战100天 AI In LeetCode Day08&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-102.1 题目2.2 题解 三、面试经典 150 题-103.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

tcpdump抓包的字节数量与ethtool统计数据不同的原因

情况介绍 在进行RDMA抓包流量分析时&#xff0c;我使用ethtool工具统计了RDMA网卡的流量发送数据数量&#xff0c;然后使用tcpdump进行抓包。 经过分析发现&#xff0c;tcpdump得到的数据数量总是大于ethtool得到的数据数量&#xff0c;而且每个数据包会多出4个字节。 分析 …

eclipse安装lombok插件

lombok插件下载:Download 下载完成&#xff0c;lombok.jar放到eclipse根目录&#xff0c;双击jar运行 运行界面&#xff0c;点击Install安装。 安装完成&#xff0c;重启IDE&#xff0c;rebuild 项目。 rebuild 项目

【分享】Excel“只读方式”的两种模式

查阅Excel表格的时候&#xff0c;担心不小心修改了内容&#xff0c;可以给Excel设置以“只读方式”打开&#xff0c;这样就算修改了内容也不能直接保存表格。Excel表格可以设置两种“只读方式”&#xff0c;一起来看看吧&#xff01; “只读方式” 1&#xff1a; 打开Excel表…

cgo与调用c的回调函数指针

cgo直接调用函数&#xff0c;使用基本数据类型非常简单&#xff0c;包括一些结构体也比较简单&#xff0c;嵌套的稍微复杂些&#xff0c;但也可以&#xff0c;但有的时候&#xff0c;cgo调用c函数&#xff0c;会需要传递一个回调函数的指针&#xff0c;这时候就比较复杂了&…

基于PHP的设云尘资讯网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

工作记录--(用HTTPS,为啥能被查出浏览记录?如何解决?)---每天学习多一点

由于网络通信有很多层&#xff0c;即使加密通信&#xff0c;仍有很多途径暴露你的访问地址&#xff0c;比如&#xff1a; DNS查询&#xff1a;通常DNS查询是不会加密的&#xff0c;所以&#xff0c;能看到你DNS查询的观察者&#xff08;比如运营商&#xff09;是可以推断出访问…

平安人寿基于 Apache Doris 统一 OLAP 技术栈实践

导读&#xff1a;平安人寿作为保险行业领军企业&#xff0c;坚持技术创新&#xff0c;以数据业务双轮驱动的理念和更加开放的思路来应对不断增长的数据分析和应用需求&#xff1b;以深挖数据价值、保障业务用数效率为目标持续升级大数据产品体系。自 2022 年起平安人寿开始引入…

初始MySQL(五)(自我复制数据,合并查询,外连接,MySQL约束:主键,not null,unique,foreign key)

目录 表复制 自我复制数据(蠕虫复制) 合并查询 union all(不会去重) union(会自动去重) MySQL表的外连接 左连接 右连接 MySQL的约束 主键 not null unique(唯一) foreign key(外键) 表复制 自我复制数据(蠕虫复制) #为了对某个sql语句进行效率测试,我们需要海量…

No195.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…