python【正则表达式】
正则表达式
1.正则的作用
正则表达式式一种可以让复杂的字符串变得简单的工具。
写正则表达式的时候就是用正则符号来描述字符串规则。
2.正则语法
需要导入模块
from re import fullmatch, findall, search
2.1.第一类:匹配类符号
1)普通字符—在正则表达式中表式符号本身的符号
result = fullmatch(r'abc', 'abc')
print(result) # <re.Match object; span=(0, 3), match='abc'>
2).(点) —匹配任意一个字符
result = fullmatch(r'.bc', 'wbc') # 第一位任意字符都可以,第二位和第三位必须是bc否则为空
print(result) # <re.Match object; span=(0, 3), match='wbc'>
result = fullmatch(r'.bc', 'wcc')
print(result) # None
3)\d — 匹配任意一个数字字符
result = fullmatch(r'\d\dabc', '88abc') # abc前面任意两个数字都可以
print(result) # <re.Match object; span=(0, 5), match='88abc'>
4)\s —— 匹配任意一个空白字符
空白字符:空格(‘’)、换行(‘\n’)、水平制表符(‘\t’)
result = fullmatch(r'123\sabc', '123 abc')
result1 = fullmatch(r'123\sabc', '123\tabc')
5)\w — 匹配任意一个字母、数字、下划线或者中文
result11 = fullmatch(r'abc\w123', 'abcT123')
result12 = fullmatch(r'abc\w123', 'abc8123')
result2 = fullmatch(r'abc\w123', 'abc_123')
result3 = fullmatch(r'abc\w123', 'abc我123')
6)\D、\S、\W —— 分布和\d、\s、\w的功能相反
\D —— 除了数字的任意字符
result4 = fullmatch(r'abc\D123', 'abcw123')
result5 = fullmatch(r'abc\D123', 'abc8123') # None
\S —— 除了空白字符的任意字符
result41 = fullmatch(r'abc\S123', 'abc1123')
result51 = fullmatch(r'abc\SD123', 'abc 123') # None
\W —— 除了字母,数字,下划线和中文的任意字符
result42 = fullmatch(r'abc\W123', 'abc*123')
result52 = fullmatch(r'abc\W123', 'abc_123') # None
注意:如果字符中间是tab键,不可以,因为只能匹配任意一个字符,tab是四个。
7)[字符集] —— 匹配在字符集中的任意一个字符
[abc] —— 匹配a或者b或者c
[abc\d] —— 匹配a或者b或者c或者任意数字:[abc0123456789]
[0-9] —— 匹配字符0到9中任意一个字符
[a-z] —— 匹配任意一个小写字母
[A-Z] —— 匹配任意一个大写字母
[a-z%] —— 匹配任意一个小写字母或者%
[a-zA-Z] —— 匹配任意一个字母
[a-zA-Z\d] —— 匹配任意一个字母或者数字
[\u4e00-\u9fa5] —— 匹配任意一个中文
result6 = fullmatch(r'abc[你好hello]123', 'abc你123')
print(result6) # <re.Match object; span=(0, 7), match='abc你123'>result33 = fullmatch(r'abc[\u4e00-\u9fa5]123', 'abc婷123')
print(result33)
8)[^
字符串] —— 匹配不在字符集中的任意一个字符
result71 = fullmatch(r'abc[^MN]123', 'abca123') # 除了MN的字符,其它都可以
result72 = fullmatch(r'abc[^MN]123', 'abcM123') # None
2.2 第二类符号:匹配次数符号
匹配类符号 匹配次数
1) * —— 任意次数(0次或者1次或者多次)
a* —— a出现任意多次
\d* —— 任意多个任意数字
[abc]* —— abc中任意一个字符可以出现任意多次
result81 = fullmatch(r'1a*2', '1aaaaaaa2')
result82 = fullmatch(r'M\d*N', 'M1234567890N')
result83 = fullmatch(r'M[3-9]*N', 'M1234567890N')
2) + —— 一次或者多次(至少1次)
result86 = fullmatch(r'1a+2', '1aaa2')
3) ? —— 0次或者1次
result84 = fullmatch(r'1a?2', '1aa2') # none
result85 = fullmatch(r'1a?2', '1a2')
4) {}
{N} —— N次
{M,N} —— M到N次
{M,} —— 至少M次
{,N} —— 最多N次
result8 = fullmatch(r'1a{3}2', '1aaa2') # a出现3次
result87 = fullmatch(r'1a{3,6}2', '1aaaa2') # a出现3到6次都可以
# 练习:写一个正则表达式,可以匹配任意一个除了0的整数。
# 合法:233、+234、-7283、100、-2000
# 不合法:0、0002、2.23
result9 = fullmatch(r'[-+]?[1-9]\d*', '0.123')
print(result9)
5)贪婪和非贪婪模式
1.在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个次数,非贪婪取最少的那个次数。
2.默认是贪婪模式·
3.贪婪模式:+
、?
、*
、{M,N}
、{M,}
、{,N}
非贪婪模式:+?
、??
、*?
、{M,N}?
、{M,}?
、{,N}?
result10 = search(r'a.{3,5}b', 'a123b') # 匹配字符串中第一个满足正则表达式,就是取三个
print(result10)
# 'ahhhhb','ahhhhbyyb','ahhhhbyybuuub'
result121 = search(r'a.+b', 'dhwahhhhbyybuuubvxgdfs')
print(result121) # 'ahhhhbyybuuub'
# 非贪婪,就是在正常的写法后面加一个?
result122 = search(r'a.+?b', 'dhwahhhhbyybuuubvxgdfs')
print(result122) # 'ahhhhb'
# 练习:使用正则提取top250中每个电影的详情页地址
import requests
from re import findallheaders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 ''Safari/537.36 '
}
response = requests.get('https://movie.douban.com/top250?start=0&filter=', headers=headers)
result = findall(r'<a href="(https://movie.douban.com/subject/.*?/)" ', response.text)
print(result)
#方法2
response = requests.get('https://movie.douban.com/top250?start=0&filter=', headers=headers)
result = list(set(findall(r'https://movie.douban.com/subject/.*?/ ', response.text)))
print(result)
3.分组和分支
1)分组 —— ()
正则表达式中可以用()将部分内容括起来表示一个整体;括号括起来的部分就是一个分组
a.整体操作的时候需要分组
b.重复匹配 —— 正则中可以通过\M来重复它前面第M个分组匹配的结果
c.捕获 —— 提取分组匹配到的结果(捕获分为自动捕获(findall)和手动捕获)
1.整体操作
# 整体操作
# '23M'
result23 = fullmatch(r'(\d\d[A-Z])+', '45T45H65F56G90D')
print(result23)
2.重复匹配
# 重复匹配;\1是指的是重复前面第一个括号
#案例: '90k90' , '80u80','99u99'
result32 = fullmatch(r'(\d\d)[A-Z]\1', '90K90')
print(result32) # <re.Match object; span=(0, 5), match='90K90'>
# \2是指的是重复第2个括号
result3211 = fullmatch(r'(\d{3})([A-Z]{2})=\2\1', '999LO=LO999')
print(result3211) # <re.Match object; span=(0, 11), match='999LO=LO999'>
#案例2: 提取中文后的数字
# findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
message = 'hfuuf你好335556432jfigh89和2470'
result99 = findall(r'[\u4e00-\u9fa5](\d+)', message)
print(result99) # ['335556432', '2470']
#案例3:提取身高的数据
message = '我是小明,今年18岁,身高180cm,体重70kg'
result = search(r'身高(\d+)cm,体重(\d+)kg', message)
2)匹配对象.group(N) —— 获取匹配结果中指定的分组匹配到的内容
print(result) # <re.Match object; span=(11, 25), match='身高180cm,体重70kg'>
print(result.group()) # 身高180cm,体重70kg
print(result.group(1), result.group(2)) # 180 70
3) 分支 —— |
正则1|正则2|正则3|.... —— 先用正则1进行匹配,匹配成功直接成功;匹配失败用正则2进行匹配...
result = fullmatch('\d{3}|[a-z]{2}', 'mn')
print(result) # <re.Match object; span=(0, 2), match='mn'>result = fullmatch(r'abc\d\d|abc[A-Z]{2}', 'abc23')
print(result) # <re.Match object; span=(0, 5), match='abc23'>result = fullmatch(r'abc(\d\d|[A-Z]{2})', 'abcLL')
print(result) # <re.Match object; span=(0, 5), match='abcLL'>
4.转义符号
转义符号:在本身具有特殊功能或者特殊意义的符号前加,让特殊符号变成普通意思。
# 案例:匹配整数部分和小数部分都是两位数的小数
result = fullmatch(r'[1-9]\d\.\d\d', '23.45')
print(result) #<re.Match object; span=(0, 5), match='23.45'># 案例:需要求两个数的和
result = fullmatch(r'\d\+\d','3+4')
print(result) #<re.Match object; span=(0, 3), match='3+4'># 案例:打印’(amd)‘
result = fullmatch(r'\([a-z]{3}\)','(jsk)')
print(result) #<re.Match object; span=(0, 5), match='(jsk)'># 注意:单独存在有特殊意义的符号,在[]中它的功能会自动消失
# 适用于 + . ? * $
result = fullmatch(r'\d[+]\d','3+4')
print(result) #<re.Match object; span=(0, 3), match='3+4'>
5.re模板
re模块 —— 提供了python中所有和正则相关的函数。
- fullmatch(正则表达式,字符串) —— 用整个字符串判断是否满足正则表达式所描述的规则,匹配成功返回匹配对象,匹配失败None
- findall(正则表达式,字符串) —— 获取字符串所有满足正则表达式的子串,默认返回一个列表,列表中匹配的元素是所有子串;存在自动捕获;
- search(正则表达式,字符串) —— 匹配字符串中第一个满足正则表达式的子串,匹配成功返回匹配对象,匹配失败返回空
- split(正则表达式,字符串) —— 将字符串中 所有满足正则的子串作为切割点进行切割
- split(正则表达式,字符串,N) —— 将字符串中前N个满足正则的子串作为切割点进行切割
- sub(正则表达式,字符串1,字符串2) —— 将字符串2中所有满足正则的子串都替换成字符串1
- sub(正则表达式,字符串1,字符串2,N)
- finditer(正则表达式,字符串) —— 获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配对象
- match(正则表达式,字符串) —— 匹配字符串开头
str1 = '技术7d3eee5eee7ef7njk9你减肥胶囊7'
print(str1.split('7')) # ['技术', 'd3eee5eee', 'ef', 'njk9你减肥胶囊', '']str1 = '技术7d3eee5eee7ef7njk9你减肥胶囊7'
print(split(r'\d+', str1, 2)) # ['技术', 'd', 'eee5eee7ef7njk9你减肥胶囊7']str1 = '技术7d3eee5eee7ef7njk9你减肥胶囊7'
print(sub(r'\d', '+', str1)) #技术+d+eee+eee+ef+njk+你减肥胶囊+message = '妈的,sb,西八,都打起来了你还在打野!操!fuck'
print(sub(r'(?i)妈的|sb|西八|操|f\s*u\s*c\s*k|艹','*',message)) #*,*,*,都打起来了你还在打野!*!*str1 = '技术7d3eee5eee7ef7njk9你减肥胶囊7'
result = finditer(r'\d+', str1)
print(list(result)) #<re.Match object; span=(15, 16), match='7'>, <re.Match object; span=(19, 20), match='9'>, <re.Match object; span=(25, 26), match='7'>]print(fullmatch(r'\d{3}', '234'))
print(match(r'\d{3}', '234Ihs你好'))
6.参数
1)忽略大小写:(?i)
print(fullmatch(r'(?i)abc', 'abc'))
print(fullmatch(r'(?i)abc', 'Abc'))
print(fullmatch(r'(?i)abc', 'ABc'))
print(fullmatch(r'(?i)abc', 'AbC'))
2)单行匹配:(?s)
多行匹配(默认):.(点) 不能和换行符(\n)进行匹配
单行匹配:.(点)可以和换行符进行匹配
print(fullmatch(r'abc.123','abc0123')) # None
# print(fullmatch(r'abc.123','abc\n123'))
print(fullmatch(r'(?s)abc.123','abc\n123')) # <re.Match object; span=(0, 7), match='abc\n123
举例:
'''
# 输入多行
name:'student
——小张'
'''
message = """name:"student
wqe小张"
"""
result = findall(r'(?s)name:"(.+)"',message)
print(result) #['student\nwqe小张']
相关文章:
python【正则表达式】
正则表达式 1.正则的作用 正则表达式式一种可以让复杂的字符串变得简单的工具。 写正则表达式的时候就是用正则符号来描述字符串规则。 2.正则语法 需要导入模块 from re import fullmatch, findall, search2.1.第一类:匹配类符号 1)普通字符—在…...
Ubuntu常见系统问题解决方式
Ubuntu常见系统问题解决方式Ubuntu每次开机后提示检测到系统程序出现问题的解决方法Ubuntu循环登陆问题问题描述原因解决方法文件夹打开缓慢Ubuntu启动后GUI界面卡住不动Ubuntu18.04使用过程中常遇到的问题Ubuntu每次开机后提示检测到系统程序出现问题的解决方法 首先…...

C/C++中的虚拟内存
文章目录一、虚拟内存二、C中的虚拟内存分配模型三、C中的虚拟内存分配模型四、堆区和栈区的区别一、虚拟内存 虚拟内存是一种实现在计算机软硬件之间的内存管理技术,它将程序使用到的内存地址(虚拟地址)映射到计算机内存中的物理地址&#…...
Qt C++与Python混合编程:补充错误
在提示中,需要引用Python.h,出现错误。 1、找不到Python.h 如果是pro工程,需要在里面配置; INCLUDEPATH /Users/xinnianwang/opt/anaconda3/include LIBS /Users/xinnianwang/opt/anaconda3/lib 如果是CMakeLists.txt需要配…...

2023-04-01:当Go语言遇见FFmpeg视频解码器,使用Go语言改写decode_video.c文件,提升视频解码效率与开发体验。
2023-04-01:当Go语言遇见FFmpeg视频解码器,使用Go语言改写decode_video.c文件,提升视频解码效率与开发体验。 答案2023-04-01: 步骤如下: 1.导入必要的依赖库,包括 fmt、os、unsafe 和其它 FFmpeg 库相关…...

Solidity 学习笔记
主要参考网上资料学习,个人学习笔记有删改,参考出处在文末列出。 0 基础 IDE: remixType Bool: bool public _bool true; 默认false;整型:int、uint、uint256,默认0;地址类型:address,分为 payable 和普…...

ThreadLocal原理
关键点总结: ThreadLocal更像是对其他类型变量的一层包装,通过ThreadLocal的包装使得该变量可以在线程之间隔离和当前线程全局共享。在Thread中有一个threadLocals变量,类型为ThreadLocal.ThreadLocalMap,ThreadLocalMap中key是Th…...
串操作指令详解 MOVS,LODS,STOS,CMPS,SCAS,REP
指令包括:MOVS,LODS,STOS,CMPS,SCAS,REP 串的概念:串是连续存放再内存中的字节块或字块。每个串有一个起始地址和长度, 待操作的数据串称为源串,目的地址称为目标串 目录…...

Java实现判断素数
1 问题 判断101-200之间有多少个素数,并输出所有素数。 2 方法 package homework04; public class Test05 { public static void main(String[] args) { for (int i 101; i < 201; i) { boolean flag true; for (int j 2; j…...

PHP初级教程------------------(2)
目录 运算符 赋值运算符 算术运算符 比较运算符 逻辑运算符 连接运算符 错误抑制符 三目运算符 自操作运算符 编辑 计算机码 位运算符 运算符优先级 流程控制 控制分类 顺序结构 分支结构 If分支 Switch分支 循环结构 For循环 while循环 do-while循环 循环控制 …...
【SQL开发实战技巧】系列(三十五):数仓报表场景☞根据条件返回不同列的数据以及Left /Full Join注意事项
系列文章目录 【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧…...

springBoot自动配置过程介绍
什么是自动配置 以前整合spring mybatis框架时候,需要加很多的bean, 比如说sqlSessionFactory等等 现在springboot帮我们干了,我们只需要引入对应的starter就可以了。 springBoot可以帮我们配置好了一些bean. 如mysql, mogondb相关操作等等ÿ…...

PostgreSQL最后的救命稻草 — pg_resetwal
pg_resetwal— 重置 PostgreSQL 数据库集群的预写日志和其他控制信息 适用版本:PostgreSQL 12/13/14/15语法 pg_resetwal [ -f | --force ] [ -n | --dry-run ] [option...] [ -D | --pgdata ]datadir描述pg_resetwal清除预写日志 WAL,并可选地重置pg_c…...

彻底关闭Windows更新
一、关闭Windows Update服务 1、按“Windows R”键,打开运行对话框,并输入“services.msc”,然后再单击“确定”。 2、在弹出的服务窗口中,找到“Windows Update”选项并双击打开它。 3、在弹出的“Windows Update的属性”对话框…...

Java正则表达式语法
Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 2在字符串中查询字符或者字符串 3常用正则表达式 4正则表达式语法 1匹配验证-验证Email是否正确 public static void main(String[] args) { // 要验证的字符串 String str "servicexsoftlab.net&q…...
【2023-3-29】JavaScript使用promise顺序调用函数并抛出异常
JavaScript使用promise顺序调用函数并抛出异常 场景 新建或者编辑时,一个页面中存在多个表单,每个表单都有单独进行表单验证。点击提交时,若有一个表单校验失败,则不能提交。 ps:为啥不放在一个表单中? (…...

Python实现GWO智能灰狼优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 灰狼优化算法(GWO),由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能…...
从redis到epoll到mmap
redis为什么这么快? 比较容易答出的答案 1)纯粹的内存操作 2)单线程操作,不用考虑线程切换 其他优势 3)I/O 多路复用,使用epoll 4)Reactor 设计模式 I/O 多路复用有三种 select、poll、epoll select:使用数组存储轮询 poll:使用链表轮询 epo…...
STM32CubeMX快速构造工程模板(一)
STM32CubeMX作为一个免费开源的软件,能够可视化配置STM32或其他产品硬件资源,能过快速地构造工程模板,很是方便!!! 目录 STM32CubeMX快速构造工程模板 首先第一步,打开软件-点击按钮-输入型号-双击打开。...

Java Web中的ServletContext对象
目录 ServletContext对象 获取上下文初始化参数的相关方法 创建ServletContext对象 1)通过 GenericServlet 提供的 getServletContext() 方法 2)通过 ServletConfig 提供的 getServletContext() 方法 3)通过 HttpSession 提供的 getServletCo…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...