Python正则

1.正则表达式

1.1含义:记录文本规则的代码,字符串处理工具

注意:需要导入re模块

1.2特点:

1.语法比较负杂,可读性较差

2.通用性很强,适用于多种编程语言

1.3步骤:

1.导入re模块   import re

2.使用match方法进行匹配操作

re.match()能匹配出以XXX开头的字符串,如果起始位置没有匹配成功,则返回None

3.如果上一步匹配成功使用group()提取数据

re.match(pattern,string)    pattern--匹配正则表达式     string--要匹配的字符串

import reres = re.match('pa','panda')
print(res)          #<re.Match object; span=(0, 2), match='pa'>
print(res.group())  #pa
import reres = re.match('pa','apnda')
print(res)          #None

注意:match是从开始位置匹配数据,匹配不到就没有

2.匹配单个字符

字符功能
.任意匹配一个字符,除\n
[ ]匹配[ ]中列举的字符
\d匹配数字,即0-9
\D匹配非数字,即不是数字
\s匹配空白,即空格,tab键
\S匹配非空白
\w匹配单词字符,即a-z,A-Z,0-9,_,汉字
\W匹配非单词字符

2.1  .   任意匹配一个字符,除\n --常用

import re
res = re.match('.a.','panda')
print(res)          
print(res.group())   #pan

2.2 [ ] 匹配[ ]中列举的字符  --常用

import re
res = re.match('[hepa]','panda')
print(res)
print(res.group())   #p

匹配0-9

写法一:

import re
res = re.match('[0123456789]','26378')
print(res)
print(res.group())   #2

写法二:

import re
res = re.match('[0-9]','26378')
print(res)
print(res.group())   #2
import re
res = re.match('[0-45-9]','26378')
print(res)
print(res.group())   #2

a-zA-Z代表列举出所有的大小写字母

2.3 \d匹配数字0-9   --常用

import re
res = re.match('\d\d','76382')
print(res)
print(res.group())   #76

2.4\D匹配非数字  --常用

import re
res = re.match('\D\D\D','<_panda')
print(res)
print(res.group())   #<_p

 2.5 \s匹配空白 及空格和tab键

import re
res = re.match('.\s\s..','h   ello')
print(res)
print(res.group())   #h   e

2.6 \S匹配非空白

import re
res = re.match('.\S\S..','h13.(ello')
print(res)
print(res.group())   #h13.(

2.7 \w匹配单词字符,匹配单词字符,即a-z,A-Z,0-9,_,汉字

import re
res = re.match('.\w\w..','h_爱ello')
print(res)
print(res.group())   #h_爱el

2.8 \W匹配非单词字符

import re
res = re.match('\W\W','。¥llo')
print(res)
print(res.group())   #。¥

3.匹配多个字符

字符功能
*匹配前一个字符,出现0次或者无数次,即可有可无 
+匹配前一个字符,出现1次或者无数次,即至少一次
?匹配前一个字符,出现1次或者0次
{m}匹配前一个字符,出现m次
{m,n}匹配前一个字符从m次到n次

3.1* 匹配前一个字符,出现0次或者无数次,即可有可无   --常用

import re
res = re.match('\w*','pandan')
print(res.group())     #panda

3.2+匹配前一个字符,出现1次或者无数次,即至少一次(小于1次会报错)    --常用

import re
res = re.match('\w+','pandan')
print(res.group())     #pandares = re.match('\S+','pandan')
print(res.group())     #pandares = re.match('\d+','01pandan')
print(res.group())     #01

3.3?匹配前一个字符,出现1次或者0次    --常用

import re
res = re.match('\w?','pandan')
print(res.group())     #pres = re.match('\S?','p1ms6kjn')
print(res.group())     #pres = re.match('\d?','pandan')
print(res.group())     #None

3.4{m}匹配前一个字符,出现m次

import re
res = re.match('\w{3}','pandan')
print(res.group())     #panres = re.match('\S{5}','p1ms6kjn')
print(res.group())     #p1ms6res = re.match('\d{0}','pandan')
print(res.group())     #None

3.5{m,n}匹配前一个字符从m次到n次

注意:必须满足m<n,总的可以匹配的数多于n个则匹配n个,总数小于n时,匹配的数要在m,n之间,有多少个匹配多少个。

import re
res = re.match('\w{3,4}','pandan')
print(res.group())     #pandres = re.match('\S{1,5}','p1ms6kjn')
print(res.group())     #p1ms6res = re.match('\w{2,7}','pandan')
print(res.group())     #panda

4.匹配开头结尾

4.1^

4.1.1 ^匹配开头字符串,表示以……开头,对……取反

import re
res = re.match('^p','python')
print(res.group())     #p
res = re.match('^py','python')
print(res.group())     #py
res = re.match('^py','ython')
print(res.group())     #报错

4.1.2 ^在[ ] 中表示不匹配(即表示除了[ ]内的匹配开头字符)

import re
res = re.match('[^p]','thonpy')
print(res.group())     #t
res = re.match('[^py]','panda')
print(res.group())     #报错
res = re.match('[^py]','%.1qm')
print(res.group())     #%

4.2 $ 匹配字符串结尾,表示以……结尾

import re
res = re.match('.*y$','thonpy')
print(res.group())     #thonpy
res = re.match('\S*da$','panda')
print(res.group())     #panda
res = re.match('..1$','%.1qm')
print(res.group())     #报错

5.匹配分组

|匹配左右任意一个表达式
(ab)将括号中字符做一个分组
\num引用分组num匹配到的字符串
(?P<name>)分组起别名
(?P=name)引用别名为name分组匹配到的字符串

5.1 | 匹配左右任意一个表达式

import re
res = re.match('abc|csdn','abc')
print(res.group())   #abc
res = re.match('panda|monkey','key')
print(res.group())   #报错
res = re.match('cn|en|com','com')
print(res.group())   #com

5.2 (ab) 将括号中字符做一个分组

import re
res = re.match('w{3}\.\w*.(123|985|m73)\Sen','www.endu@123.en')
print(res.group())    #www.endu@123.en

\. :表示匹配.

5.3  \num 引用分组num匹配到的字符串(经常在匹配标签时被使用)

import re
res = re.match(r'<(html)><(body)>login</\2></\1>','<html><body>login</body></html>')
print(res.group())    #<html><body>login</body></html>

注意:从外到内排序,编号从1开始

5.4  (?P<name>) 分组起别名

5.5 (?P=name)引用别名为name分组匹配到的字符串

import re
res = re.match(r'<(?P<L1>\w*)><(?P<L2>\w*)>\w*</(?P=L2)></(?P=L1)>','<html><body>login</body></html>')
print(res.group())    #<html><body>login</body></html>

 综合使用:

网址前缀一般为www,后缀.com、.cn、.org

import re
li = ['www.baidu.com','www.python.org','http.jd.cn','www.abc.cn']
for i in li:res = re.match(r'w{3}(\.)\w*\1(com|org|cn)', i)if res:print(res.group())else:print(f"{i}错误")

 

6.高级用法

6.1 search():扫描整个字符串并返回第一个成功匹配的对象,如果匹配失败,就返回None

import re
res = re.search('th','pythonth')
print(res.group())   #th
res = re.search('.','pythonth')
print(res.group())   #p
res = re.search('.*','pythonth')
print(res.group())   #pythonth

6.2 findall():以列表的形式返回整个字符串所有匹配到的字符串(如果匹配失败则返回一个空列表)

import re
res = re.findall('th','pythonth')
print(res)   #['th', 'th']
res = re.findall('.','pythonth')
print(res)   #['p', 'y', 't', 'h', 'o', 'n', 't', 'h']
res = re.findall('.*','pythonth')
print(res)   #['pythonth', '']
res = re.findall('\d','pythonth')
print(res)   #[]

 总结:

1.match()从开头开始匹配,匹配成功返回match对象,通过group()进行提取,匹配失败就返回None,只匹配一次

2.search()从头到尾匹配,匹配成功就返回第一个匹配成功的对象,通过group进行提取,匹配失败则返回None,只匹配一次

3.findall()从头到尾匹配,匹配成功返回一个列表,匹配所有匹配成功的数据,不需要经过group()进行提取,没有group

6.3 sub():将匹配到的数据进行替换

sub(pattern,repl,string,count)

     pattern--正则表达式

     repl--新内容

     string--字符串

     count--指替换的次数

import re
res = re.sub('world','python','hello world')
print(res)    #hello python
res = re.sub('world','python','hello world world world',2)
print(res)    #hello python python world
res = re.sub('\d','1','今天是28号')
print(res)    #今天是11号
res = re.sub('\d','1','今天是28号',1)
print(res)    #今天是18号

6.4 split():根据匹配进行切割字符串,并返回一个列表

split(pattern,string,maxsplit)

     pattern--正则表达式

     string--字符串

     maxsplit--指定最大分割次数

没有设置次数就默认全部分割

import re
res = re.split(',','good,morning')
print(res)      #['good', 'morning']
res = re.split('|','good,morning')
print(res)      #['', 'g', 'o', 'o', 'd', ',', 'm', 'o', 'r', 'n', 'i', 'n', 'g', '']
res = re.split(',','nice,to,meet,you',2)
print(res)      #['nice', 'to', 'meet,you']

7.贪婪与非贪婪

贪婪匹配:在满足匹配时,匹配尽可能长的字符串,在默认情况下,采用贪婪匹配

非贪婪匹配:在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配

import re
res = re.match('ing*','inggggggg')
print(res.group())   #inggggggg
res = re.match('ing*?','inggggggg')
print(res.group())   #in
res = re.match('g*?','ggggggg')
print(res.group())   #None
res = re.match('g{1,5}','ggggggg')
print(res.group())   #ggggg
res = re.match('g{1,5}?','ggggggg')
print(res.group())   #g

8.原生字符串

Python中,在字符串前面加上r表示原生字符串

正则表达式中匹配自促传中字符\需要\\\\,加上r后只需要\\

import re
res = re.match('\\\\','\pdf')
print(res.group())   #\
import re
res = re.match(r'\\\\',r'\\pdf')
print(res.group())   #\\

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

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

相关文章

网络安全虚拟化组成

网络安全虚拟化组成是指利用虚拟技术对网络安全功能进行集成、管理和提供的过程。在当今数字化时代&#xff0c;网络安全已经成为企业以及个人信息安全的重要组成部分。而华为作为一家全球知名的通信技术解决方案提供商&#xff0c;在网络安全领域拥有着丰富的经验和技术积累。…

【异地访问本地DeepSeek】Flask+内网穿透,轻松实现本地DeepSeek的远程访问

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言依赖Flask构建本地网页访问LM Studio 开启网址访问DeepSeek 调用模板Flask 访问本…

【AVL树】—— 我与C++的不解之缘(二十三)

什么是AVL树&#xff1f; AVL树发明者是G. M. Adelson-Velsky和E. M. Landis两个前苏联科学家&#xff0c;他们在1962年论文《An algorithm for the organization of information》中发表了AVL树。AVL树是最先发明的自平衡二叉搜索树&#xff0c;说白了就是能够自己控制平衡结构…

使用C#控制台调用本地部署的DeepSeek

1、背景 春节期间大火的deepseek&#xff0c;在医疗圈也是火的不要不要的。北京这边的医院也都在搞“deepseek竞赛”。友谊、北医三院等都已经上了&#xff0c;真是迅速啊&#xff01; C#也是可以进行对接&#xff0c;并且非常简单。 2、具体实现 1、使用Ollama部署DeepSeek…

Java AQS(AbstractQueuedSynchronizer):深入剖析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

蓝桥备赛(七)- 函数与递归(上)

一、函数是什么 数学中 &#xff0c; 我们其实就见过函数的概念 &#xff0c; 比如 : 一次函数 y kx b &#xff0c; k 和 b 都是常数 &#xff0c; 给一个任意的x 就得到一个 y 值。 其实C/C语言中就引入了函数(function&#xff09;的概念 &#xff0c; 有些翻译成&#…

【java】@Transactional导致@DS注解切换数据源失效

最近业务中出现了多商户多租户的逻辑&#xff0c;所以需要分库&#xff0c;项目框架使用了mybatisplus所以我们自然而然的选择了同是baomidou开发的dynamic.datasource来实现多数据源的切换。在使用初期程序运行都很好&#xff0c;但之后发现在调用com.baomidou.mybatisplus.ex…

DeepSeek 助力 Vue3 开发:打造丝滑的网格布局(Grid Layout)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Ragflow与Dify之我见:AI应用开发领域的开源框架对比分析

本文详细介绍了两个在AI应用开发领域备受关注的开源框架&#xff1a;Ragflow和Dify。Ragflow专注于构建基于检索增强生成&#xff08;RAG&#xff09;的工作流&#xff0c;强调模块化和轻量化&#xff0c;适合处理复杂文档格式和需要高精度检索的场景。Dify则旨在降低大型语言模…

形式化数学编程在AI医疗中的探索路径分析

一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…

JVM线程分析详解

java线程状态&#xff1a; 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。运行(RUNNABLE)&#xff1a;Java线程中将就绪&#xff08;ready&#xff09;和运行中&#xff08;running&#xff09;两种状态笼统的称为“运行”。 线程对象创建…

deepseek+mermaid【自动生成流程图】

成果&#xff1a; 第一步打开deepseek官网(或百度版&#xff08;更快一点&#xff09;)&#xff1a; 百度AI搜索 - 办公学习一站解决 第二步&#xff0c;生成对应的Mermaid流程图&#xff1a; 丢给deepseek代码&#xff0c;或题目要求 生成mermaid代码 第三步将代码复制到me…

C大调中的A4=440Hz:音乐、物理与认知的交响

引言&#xff1a; 在音乐的世界里&#xff0c;每个音符都是一个独特的存在&#xff0c;它们按照特定的规则和比例相互交织&#xff0c;创造出和谐的旋律。在众多音符中&#xff0c;A4440Hz作为一个国际标准音高&#xff0c;它在C大调中扮演着“la”的角色。这一看似简单的对应关…

ASPNET Core笔试题 【面试宝典】

文章目录 一、如何在ASP.NET Core中激活Session功能&#xff1f;二、什么是中间件&#xff1f;三、ApplicationBuilder的Use和Run方法有什么区别&#xff1f;四、如何使TagHelper在元素这一层上失效&#xff1f;五、什么是ASP.NET Core&#xff1f;六、ASP.NET Core中AOP的支持…

使用DeepSeek实现自动化编程:类的自动生成

目录 简述 1. 通过注释生成C类 1.1 模糊生成 1.2 把控细节&#xff0c;让结果更精准 1.3 让DeepSeek自动生成代码 2. 验证DeepSeek自动生成的代码 2.1 安装SQLite命令行工具 2.2 验证DeepSeek代码 3. 测试代码下载 简述 在现代软件开发中&#xff0c;自动化编程工具如…

MapReduce编程模型

MapReduce编程模型 理解MapReduce编程模型独立完成一个MapReduce程序并运行成功了解MapReduce工程流程掌握并描述出shuffle全过程&#xff08;面试&#xff09;独立编写课堂及作业中的MR程序理解并解决数据倾斜 1. MapReduce编程模型 Hadoop架构图 Hadoop由HDFS分布式存储、M…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.2Kibana可视化初探

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 10分钟快速部署Kibana可视化平台1. Kibana与Elasticsearch关系解析1.1 架构关系示意图1.2 核心功能矩阵 2. 系统环境预检2.1 硬件资源配置2.2 软件依赖清单 3. Docker快速部…

基于YOLO11深度学习的遥感视角农田检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Redis7——进阶篇(一)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

ST-LINK端口连接失败,启动GDB server失败的问题处理方法,有效

目录 1. 问题描述2. 解决办法2.1 后台关闭2.2 后台关闭无法找到ST进程或者关闭后未解决 1. 问题描述 报错&#xff1a; Failed to bind to port 61235, error code -1: No error Failure starting SWV server on TCP port: 61235 Failed to bind to port 61234, error code -1…