当前位置: 首页 > news >正文

Python 常用模块re

Python 常用模块re

【一】正则表达式

【1】说明

  • 正则表达式是一种强大的文本匹配和处理工具,主要用于字符串的模式匹配搜索替换
  • 正则表达式测试网址:正则表达式在线测试
  • 正则表达式手册:正则表达式手册

【2】字符组

  • 字符转使用[]表示,并在方括号内列出允许匹配的字符
  • 字符组中的字符之间的顺序没有特定意义,他们是等效的
  • 匹配字符组其中的任意一个字符
(1)常用字符组
正则–字符组说明
[aeiou]匹配任意一个小写元音字母
[0123456789]匹配任意一个数字
[0-9]匹配任意一个数字
[a-z]匹配任意一个小写字母
[a-zA-Z]匹配任意一个字母
[0-9a-zA-Z]匹配任意一个字母或者数字

【3】元字符

  • 正则表达式中的元字符是具有特殊含义的字符,它们不仅仅匹配自身,还具有一些特殊的功能
(1)常用元字符
正则–元字符说明
·匹配任意一个除换行符(\n)以外的字符
要匹配包括“\n”在内的任何字符,请使用像“`(.
\w匹配任意一个字母、数字或下划线
[A-Za-z0-9_]
\W匹配任意一个非字母、数字或下划线
[^A-Za-z0-9_]
\s匹配一个空白符(包括空格、制表符、换页符等)
[ \f\n\r\t\v]
\S匹配一个非空白符(包括空格、制表符、换页符等)
[^ \f\n\r\t\v]
\d匹配任意一个数字
[0-9]
\D匹配任意一个非数字
[^0-9]
\t匹配一个制表符
[\t]
\b匹配一个单词的结尾
py\b可以匹配main.py的结尾py,但是不能匹配pythonpy
a|b匹配字符a字符b
()匹配括号内的表达式,也表示一个组
[…]匹配字符组中的字符
[^…]匹配除了字符组中字符的所有字符

【4】量词

  • 正则表达式中的量词用于指定一个模式中某个元素的匹配次数
(1)常用量词
正则–量词说明
*重复零次或更多次
+重复一次或更多次
?重复零次一次
{n}重复n
{n,}重复n次或更多次贪婪匹配优先匹配多次
{n,m}重复n次m次贪婪匹配优先匹配m次
(2)非贪婪匹配
正则–量词说明
{n,m}?重复n次m次非贪婪匹配优先匹配n次

【5】位置

  • 正则表达式中的量词用于指定一个模式中某个元素的位置
(1)常用位置
正则–量词位置说明
^匹配字符串的开始
$匹配字符串的结尾

【6】分组匹配

  • 在正则表达式中,分组是用小括号 () 括起来的部分,它允许你将一组字符当作一个单独的单元来处理

  • 例如 (abc){2,4} 表示匹配连续出现 2 到 4 次的 abc

【7】转义符

  • 在正则表达式中,转义字符用于取消字符的特殊含义,使其变成普通字符
  • 例如:在正则表达式中,. 表示匹配任意字符。如果你想匹配实际的点号,需要使用 \.

【8】模式修正符

  • 正则表达式的模式修正符是一种在正则表达式模式中添加修正标志以改变匹配规则的方式。修正标志通常以字母形式添加到正则表达式的末尾,用于调整匹配的方式
说明
re.I是匹配对大小写不敏感
re.L做本地化识别匹配
re.M多行匹配,影响到^和$
re.S使.匹配包括换行符在内的所有字符
re.U根据Unicode字符集解析字符,影响\w、\W、\b、\B
re.X通过给予我们功能灵活的格式以便更好的理解正则表达式
(1)re.S代码讲解
  • 使.匹配包括换行符在内的所有字符
  • 代码目的:匹配<>中的所有内容
    • 不使用模式修正符号,无法匹配到第二个<>
    • 使用模式修正符号,匹配到所有<>
import retext = """
<age is 18>
<age is
18>
"""
pattern1 = re.compile(r"<.*>")
pattern2 = re.compile(r"<.*>", flags=re.S)
res = re.findall(pattern1, text)
print(res)
res = re.findall(pattern2, text)
print(res)# ['<age is 18>']
# ['<age is 18>', '<age is\n18>']

【二】re模块

【1】编译正则表达式compile

  • 正则表达式编译之后会生成一个正则表达式对象,该对象可以被访问多次
  • 避免了在每次匹配时都重新解析正则表达式
re.compile(pattern, flags=0)# pattern 	正则表达式
# flags		用于指定匹配模式修正符
import repattern = re.compile(r"\d")
print(pattern, type(pattern))
# re.compile('\\d') <class 're.Pattern'>
注意:模式修正符号
  • 使用编译方法时,修正符号必须放在编译方法里面,不能放在后续的使用方法中
import retext = """
<age is 18>
<age is
18>
"""# 正确
pattern1 = re.compile(r"<.*>", re.S)
print(pattern1)
res = re.findall(pattern1, text)
print(res)# 错误
pattern1 = re.compile(r"<.*>")
print(pattern1)
res = re.findall(pattern1, text, re.S)
print(res)

【2】查找结果findall

  • 所有满足匹配结果的内容,返回一个列表
  • 避免了在每次匹配时都重新解析正则表达式
re.findall(pattern, string, flags=0)# pattern 	正则表达式
# string 	待匹配字符串
# flags		用于指定匹配模式修正符
import repattern = re.compile(r"\w+")
text = "my name is bruce"
res = re.findall(pattern, text)
print(res)
# ['my', 'name', 'is', 'bruce']
注意:存在子组时
  • 将只返回子组内容

  • 需要使用非捕获分组(?:...)

import repattern = re.compile(r"\d+@(qq|163).com")
text = "15846354@qq.com"
res = re.findall(pattern, text)
print(res)
# ['qq']pattern = re.compile(r"\d+@(?:qq|163).com")
text = "15846354@qq.com"
res = re.findall(pattern, text)
print(res)
# ['15846354@qq.com']

【3】查找结果search

  • 搜索第一个第一个第一个匹配成功的对象
  • 返回一个对象为空则返回None
  • 不像findall一样存在子组的问题
re.search(pattern, string, flags=0)# pattern 	正则表达式
# string 	待匹配字符串
# flags		用于指定匹配模式修正符
注意:匹配对象的方法和属性
group()		# 匹配的结果字符串
start()		# 匹配成功的起始位置,从0开始
end()		# 匹配成功的结束位置,结束的后一个位置 
span()		# 元组形式,开始和结束位置
import repattern = re.compile(r"\d+")
text = "age is 18"
res = re.search(pattern, text)
print(res, type(res))                   # <re.Match object; span=(7, 9), match='18'> <class 're.Match'>
print(res.group())                      # 18
print(res.start())                      # 7
print(res.end())                        # 9
print(res.span(), type(res.span()))     # (7, 9) <class 'tuple'>

【3】查找结果match

  • match和search基本相同
  • 不同点:
    • match从字符串开头位置开始匹配
    • search在整个字符串中搜索第一个匹配结果
import repattern1 = re.compile(r"\w+")
pattern2 = re.compile(r"\d+")
text = "age is 18"
res = re.match(pattern1, text)
print(res)                      # <re.Match object; span=(0, 3), match='age'>
res = re.match(pattern2, text)
print(res)                      # None

【4】切割split

  • 用于根据正则表达式模式分割字符串
  • 返回一个由分割后的子字符串组成的列表
re.split(pattern, string, maxsplit=0, flags=0)# pattern 	正则表达式
# string 	待匹配字符串
# maxsplit  指定最大分割次数,0表示不限制,从前往后开始切分
# flags		用于指定匹配模式修正符
import repattern = re.compile(r"\d+")
text = "aafa121ada021da12da"
res = re.split(pattern, text)
print(res)  # ['aafa', 'ada', 'da', 'da']
res = re.split(pattern, text, maxsplit=1)
print(res)  # ['aafa', 'ada021da12da']
注意:存在子组时
  • 子组的内容也将保留在列表中

  • 使用非捕获分组(?:...),将不会保存在列表中

import repattern = re.compile(r"(qq|163)")
text = "15846354@qq.com"
res = re.split(pattern, text)
print(res)
# ['15846354@', 'qq', '.com']pattern = re.compile(r"(?:qq|163)")
text = "15846354@qq.com"
res = re.split(pattern, text)
print(res)
# ['15846354@', '.com']

【5】替换sub

  • 在字符串中替换正则表达式模式的匹配项, 默认替换
re.sub(pattern, repl, string, count=0, flags=0)# pattern 	正则表达式
# repl  	替换匹配项的字符串或可调用对象
# string 	待匹配字符串
# count  	指定最大替换次数,0表示不限制,从前往后开始替换
# flags		用于指定匹配模式修正符
import repattern = re.compile(r"\d+")
text = "age is 18"
res = re.sub(pattern, "20", text)
print(res)
# age is 20
了解:repl是可调用对象
  • 将只返回子组内容

  • 需要使用非捕获分组(?:...)

import redef to_upper(match):return match.group().upper()
text = "apple banana cherry date"
pattern = re.compile(r'\b\w{6}\b')  # 匹配长度为6的单词
result = pattern.sub(to_upper, text)
print(result)	# apple BANANA cherry datedef replace_adjacent(match):word = match.group()return f"{word} {word.upper()}"
text = "apple banana cherry date"
pattern = re.compile(r'\b\w{6}\b')  # 匹配长度为6的单词
result = pattern.sub(replace_adjacent, text)
print(result) 	# apple apple BANANA cherry date

【6】替换subn

  • sub和subn基本相同
  • 不同点:
    • sub返回替换后的字符串
    • sunb返回一个包含替换后的字符串和替换次数的元组
import repattern = re.compile(r"\d+")
text = "age is 18, money 50"
res = re.subn(pattern, "20", text)
print(res)
# ('age is 20, money 20', 2)

【7】切割finditer

  • 用于在字符串中查找正则表达式模式的所有匹配项
  • 返回一个迭代器
re.finditer(pattern, string, flags=0)# pattern 	正则表达式
# string 	待匹配字符串
# flags		用于指定匹配模式修正符
import repattern = re.compile(r"\d+")
text = "age is 18, money 50"
res = re.finditer(pattern, text)
print(res, type(res))
for i in res:print(i)
# <callable_iterator object at 0x000002A4EC860D90> <class 'callable_iterator'>
# <re.Match object; span=(7, 9), match='18'>
# <re.Match object; span=(17, 19), match='50'>

【三】常用正则表达式

匹配内容正则表达式
邮箱地址^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
URL`^(https?
匹配日期(年-月-日)^\d{4}-\d{2}-\d{2}$
匹配手机号码^1[3456789]\d{9}$
匹配身份证号码^\d{17}[\dXx]
IP 地址`/((2[0-4]\d
匹配整数或浮点数^[-+]?[0-9]*\.?[0-9]+$
Unicode编码中的汉字范围/^[\u2E80-\u9FFF]+$/

【四】练习

  • 获取金额,最小两位小数
import redef get_money():while True:money = input("请输入金额(最小单位0.01):>>>").strip()pattern = re.compile(r"^\d+(\.\d{1,2})?$")res = re.match(pattern, money)if not res:print(f"输入内容{money}不合法,请输入")continuereturn moneyprint(get_money())

相关文章:

Python 常用模块re

Python 常用模块re 【一】正则表达式 【1】说明 正则表达式是一种强大的文本匹配和处理工具&#xff0c;主要用于字符串的模式匹配、搜索和替换。正则表达式测试网址&#xff1a;正则表达式在线测试 正则表达式手册&#xff1a;正则表达式手册 【2】字符组 字符转使用[]表…...

【华为OD题库-106】全排列-java

题目 给定一个只包含大写英文字母的字符串S&#xff0c;要求你给出对S重新排列的所有不相同的排列数。如:S为ABA&#xff0c;则不同的排列有ABA、AAB、BAA三种。 解答要求 时间限制:5000ms,内存限制:100MB 输入描述 输入一个长度不超过10的字符串S&#xff0c;确保都是大写的。…...

Three.js 详细解析(持续更新)

1、简介&#xff1b; Three.js依赖一些要素&#xff0c;第一是scene&#xff0c;第二是render&#xff0c;第三是carmea npm install --save three import * as THREE from "three"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js&quo…...

Unity中Shader平移矩阵

文章目录 前言方式一&#xff1a;对顶点本地空间下的坐标进行相加平移1、在属性面板定义一个四维变量记录在 xyz 上平移多少。2、在常量缓冲区进行申明3、在顶点着色器中&#xff0c;在进行其他坐标转化之前&#xff0c;对模型顶点本地空间下的坐标进行转化4、我们来看看效果 方…...

python dash 的学习笔记1

dash 用python开发web界面 https://dash.plotly.com/ 官方上支持jula F# python一类。当然我只会python只学习python中使用dash. 要做一个APP&#xff0c;用php,java以及.net都可以写&#xff0c;只所有选择python是因为最近在用这一个。同时也发现python除了慢全是优点。 资料…...

SQLITE如何同时查询出第一条和最后一条两条记录

一个时间记录表&#xff0c;需要同时得到整个表或一段时间内第一条和最后一条两条记录&#xff0c;按如下方法会提示错误&#xff1a;ORDER BY clause should come after UNION not before select * from sdayXX order by op_date asc limit 1 union select * from sday…...

四、ensp配置ftp服务器实验

文章目录 实验内容实验拓扑操作步骤配置路由器为ftp server 实验内容 本实验模拟企业网络。PC-1为FTP 用户端设备&#xff0c;需要访问FTP Server&#xff0c;从服务器上下载或上传文件。出于安全角度考虑&#xff0c;为防止服务器被病毒文件感染&#xff0c;不允许用户端直接…...

VS2020使用MFC开发一个贪吃蛇游戏

背景&#xff1a; 贪吃蛇游戏 按照如下步骤实现:。初始化地图 。通过键盘控制蛇运动方向&#xff0c;注意重新设置运动方向操作。 。制造食物。 。让蛇移动&#xff0c;如果吃掉食物就重新生成一个食物&#xff0c;如果会死亡就break。用蛇的坐标将地图中的空格替换为 #和”将…...

【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…...

字符设备驱动开发-注册-设备文件创建

一、字符设备驱动 linux系统中一切皆文件 1、应用层&#xff1a; APP1 APP2 ... fd open("led驱动的文件"&#xff0c;O_RDWR); read(fd); write(); close(); 2、内核层&#xff1a; 对灯写一个驱动 led_driver.c driver_open(); driver_read(); driver_write(…...

TrustZone之可信操作系统

有许多可信内核&#xff0c;包括商业和开源的。一个例子是OP-TEE&#xff0c;最初由ST-Ericsson开发&#xff0c;但现在是由Linaro托管的开源项目。OP-TEE提供了一个功能齐全的可信执行环境&#xff0c;您可以在OP-TEE项目网站上找到详细的描述。 OP-TEE的结构如下图所示&…...

java定义三套场景接口方案

一、背景 在前后端分离开发的背景下&#xff0c;后端java开发人员现在只需要编写接口接口。特别是使用微服务开发的接口。resful风格接口。那么一般后端接口被调用有下面三种场景。一、不需要用户登录的接口调用&#xff0c;第二、后端管理系统接口调用&#xff08;需要账号密…...

idea连接数据库,idea连接MySQL,数据库驱动下载与安装

文章目录 普通Java工程先创建JAVA工程JDBC连接数据库测试连接 可视化连接数据库数据库驱动下载与安装常用的数据库驱动下载MySQL数据库Oracle数据库SQL Server 数据库PostgreSQL数据库 下载MySQL数据库驱动JDBC连接各种数据库的连接语句MySQL数据库Oracle数据库DB2数据库sybase…...

Redis-实践知识

转自极客时间Redis 亚风 原文视频&#xff1a;https://u.geekbang.org/lesson/535?article681062 Redis最佳实践 普通KEY Redis 的key虽然可以自定义&#xff0c;但是最好遵循下面几个实践的约定&#xff1a; 格式&#xff1a;[业务名称]:[数据名]:[id] 长度不超过44字节 不…...

多维时序 | MATLAB实现SSA-CNN-SVM麻雀算法优化卷积神经网络-支持向量机多变量时间序列预测

多维时序 | MATLAB实现SSA-CNN-SVM麻雀算法优化卷积神经网络-支持向量机多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-CNN-SVM麻雀算法优化卷积神经网络-支持向量机多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现…...

leetcode160相交链表思路解析

分别让tmp1以及tmp2的结点分别先指向headA以及headB&#xff0c;当遍历完成后&#xff0c;再让tmp1以及tmp2分别指向haedB和headA反转 此处有个问题&#xff1a;为什么if判断句中写tmp1&#xff01;&#xff1d;nullptr&#xff0c;能够编译通过&#xff0c;但是写tmp1->ne…...

在线分析工具-日志优化

一、概述 针对于大日志文件&#xff0c;统计分析出日志文件的相关指标&#xff0c;帮助开发测试人员&#xff0c;优化日志打印。减少存储成本 二、日志分析指标 重复打印日志&#xff1a;统一请求reqId的重复打印日志打印最多的方法&#xff1a;检测出打印日志最多的方法…...

硬核实战!mysql 错误操作整个表全部数据后如何恢复?附解决过程、思路(百万行SQL,通过binlog日志恢复)

mysql 错误操作整个表全部数据后如何恢复&#xff1f;&#xff08;百万行SQL&#xff0c;通过binlog日志恢复&#xff09; 事件起因 事情起因&#xff1a;以为某个表里的数据都是系统配置的数据&#xff0c;没有用户数据&#xff0c;一个字段需要覆盖替换为新的url链接&#x…...

【什么是反射机制?为什么反射慢?】

✅ 什么是反射机制&#xff1f;为什么反射慢&#xff1f; ✅典型解析✅拓展知识仓✅反射常见的应用场景✅反射和Class的关系 ✅典型解析 反射机制指的是程序在运行时能够获取自身的信息。在iava中&#xff0c;只要给定类的名字&#xff0c;那么就可以通过反射机制来获得类的所有…...

PostGreSQL:货币类型

货币类型&#xff1a;money money类型存储固定小数精度的货币数字&#xff0c;小数的精度由数据库的lc_monetary设置决定。windows系统下&#xff0c;该配置项位于/data/postgresql.conf文件中&#xff0c;默认配置如下&#xff0c; lc_monetary Chinese (Simplified)_Chi…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...