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

python进阶六 正则表达式

一 正则表达式概述

1.1 为什么要学习正则表达式

在实际开发过程中经常会有查找符合某些规则的字符串,比如:邮箱、图片地址、手机号码等。想匹配或者查找符合某些规则的字符串就可以使用正则表达式了。

1.2 什么是正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式
1、比如:检索一个串是否含有某种子串(检索)
2、比如:匹配的子串做替换(替换)
3、比如:从一个串中取出符合某个条件的子串(提取)

模式:一种特定的字符串模式,这个模式是通过一些特殊的符号组成的。

正则表达式并不是Python所特有的,在Java、PHP、Go以及JavaScript等语言中都是支持正则表达式的。

1.3 正则表达式的功能

① 数据验证(表单验证、如手机、邮箱、IP地址)
② 数据检索(数据检索、数据抓取) => 爬虫功能
③ 数据隐藏(135****6235 王先生)
④ 数据过滤(论坛敏感关键词过滤)

二 re模块

什么是re模块

在Python中需要通过正则表达式对字符串进行匹配时,可使用re模块

re模块使用三步走

第一步:导入re模块

importre

第二步:使用match方法进行匹配操作

result=re.match(pattern正则表达式,string要匹配的字符串,flags=0)#flags : 可选,表示匹配模式,比如忽略大小写,多行模式等

第三步:如果数据匹配成功,使用group方法来提取数据

result.group()

案例1:

defdm01_match():# “”“匹配字符: 从大字符串中, 按照规则, 匹配符合条件的子串”“# 1 导入re模块importre# 2 使用match方法进行匹配操作# 2-1 在大的字符串中, 按照规则:“任意1个字符”+“it”+“任意1个字符”, 提取符合要求的子串# 注意: 提取出来的子串一定要符合规则result=re.match(".it.","aitcast")# 2-2 从左到右的匹配(不能跳, 不能从中间匹配), 一个字符一个字符的匹配(此时,结果是:没有找到符合规则的子串)# result = re.match(".it.", "iloveitcast")# 3 使用group方法来提取数据ifresult:info=result.group()print(info)else:print("没有找到符合规则的子串")if__name__=='__main__':dm01_match()

输出结果:

aitc

案例2:

defdm01_match():# 扫描字符返回第一个成功的匹配 def search(pattern, string, flags=0) '''importre result=re.search("\d.*","city:1beijing2.shanghai")# "\d.*": 数字开头,任意多个字符字符结尾# result = re.search(".\d.", "cityp.1.beijing2.shanghai")ifresult:print(result.group())else:print('没有匹配到')passif__name__=='__main__':dm01_match()

结果:

1beijing2.shanghai

案例3:

defdm01_match():importre sentence="车主说:你的刹车片应该更换了啊,嘿嘿"# 正则表达式: 去除多余字符p=r"呢|吧|哈|啊|啦|嘿|嘿嘿"r=re.compile(pattern=p)mystr=r.sub('',sentence)print('mystr-->',mystr)# 正则表达: 删除除了汉字数字字母和,!?。.- 以外的字符# \u4e00-\u9fa5 是用来判断是不是中文的一个条件p="[^,!?。\.\-\u4e00-\u9fa5_a-zA-Z0-9]"r=re.compile(pattern=p)mystr=r.sub('',sentence)print('mystr-->',mystr)# 半角变为全角 sentence.replace(",", ",") 逗号 感叹号 问号sentence="你好."mystr=sentence.replace(".","。")print('mystr-->',mystr)if__name__=='__main__':dm01_match()

结果:

mystr-->车主说:你的刹车片应该更换了,mystr-->车主说你的刹车片应该更换了啊嘿嘿 mystr-->你好。

三 正则表达式编写

3.1 使用re模块匹配单个字符

代码功能
.匹配任意1个字符(除了\n)
[ ]匹配[ ]中列举的字符
[^指定字符]匹配除了指定字符以外的所有字符
\d匹配数字,即0-9
\D匹配非数字,即不是数字
\s匹配空白,即 空格,tab键
\S匹配非空白
\w匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
\W匹配特殊字符,即非字母、非数字、非汉字

案例1:

defdm01_match():importre# 1 . 匹配任意1个字符(除了\n)# 匹配数据: 从左向右匹配,一个字符接着一个字符的匹配result=re.match("itcast.","itcast2")# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()

结果:

itcast2

案例2:

defdm01_match():importre# 2 [ ] 匹配[ ]中列举的字符# [a-z] [A-Z] [0-9] [a-zA-Z0-9]# 匹配数据result=re.match("itcast[123abc]","itcast376")# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()

结果:

itcast3

案例3:

defdm01_match():importre# 3 \d 匹配数字,即0-9 => [0123456789] => [0-9]# 匹配数据result=re.match("itcast\d","itcast5")# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()

结果:

itcast5

3.2 使用re模块匹配多个字符

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

案例1:

defdm01_match():importre# 1 * 匹配前一个字符出现0次或者无限次,即可有可无result=re.match("itcast1*","itcast111123333itcast")# 1出现0次或者多次# result = re.match("itcast\d*", "itcast23333itcast") # 数字出现0次或者多次# result = re.match("itcast\d*itcast", "itcast123333itcast") # 数字出现0次或者多次 itcast开始 itcast结束# result = re.match("itcast\d*itcast", "itcastitcast") # 数字出现0次或者多次 itcast开始 itcast结束# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()

结果:

itcast1111

案例2:

defdm01_match():importre# 2 + 匹配前一个字符出现1次或者无限次,即至少有1次# 数字必须出现1次或者多次result=re.match("itcast\d+itcast","itcast11333444itcast")# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()

结果:

itcast11333444itcast

案例3:

defdm01_match():importre# 3 ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有# 数字出现0次或者1次result=re.match("itcast\d?itcast","itcastitcast")# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()
itcastitcast

案例4:

defdm01_match():importre# 4 {m} 匹配前一个字符出现m次result=re.match("itcast\d{2}itcast","itcast12itcast")# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()

结果:

itcast12itcast

案例5:

defdm01_match():importre# 5 {m,n} 匹配前一个字符出现从m到n次# 注意1:{2, 5} 中括号里面,逗号之后不能加空格result=re.match("itcast\d{2,5}itcast","itcast111itcast")# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()
itcast111itcast

3.3 使用re模块匹配指定字符串开头或者结尾

代码功能
^匹配字符串开头
$匹配字符串结尾

案例1:

defdm01_match():importre# 1-1 ^ 匹配字符串开头# 匹配数据: 匹配1个数字开头的子串result=re.match("^\ditcast","2itcast")# 1 匹配1个数字开头 + itcast# result = re.match("^\ditcast", "22itcast") # 2 匹配不上# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()

结果:

2itcast

案例2:

defdm01_match():importre# 3 匹配以数字为开头以数字为结尾result=re.match("^\d.*\d$","11itcast22")# 获取数据ifresult:info=result.group()print(info)else:print("没有匹配到")if__name__=='__main__':dm01_match()

结果:

11itcast22

3.4 使用re模块提取分组数据

代码功能
|匹配左右任意一个表达式
(ab)将括号中字符作为一个分组
\num引用分组num匹配到的字符串

案例1:

defdm01_match():importre# 1 需求:在列表中["apple", "banana", "orange", "pear"],匹配apple和pearfruit=["apple","banana","orange","pear"]# 获取字符串数据forvalueinfruit:result=re.match("apple|pear",value)# 判断匹配是否成功ifresult:info=result.group()print("我想吃的水果:",value)else:print(f"这个不是我想吃的水果{value}")if__name__=='__main__':dm01_match()

结果:

我想吃的水果:apple 这个不是我想吃的水果banana 这个不是我想吃的水果orange 我想吃的水果:pear
http://www.jsqmd.com/news/669897/

相关文章:

  • 嘎嘎降AI、比话降AI、率零哪个好?花了300块测完告诉你
  • 【VScode切换覆盖模式和插入模式——解决误用问题】
  • 2026年国内回头客多的网红集装箱价格选哪家,集成房屋设计/集装箱设计/集装箱办公/集装箱销售,网红集装箱定制怎么选择 - 品牌推荐师
  • Qwen3-VL-8B创意编程:用AI解读并生成Processing艺术代码
  • Starry Night Art Gallery实战案例:非遗传承人AI辅助纹样创新设计
  • Claude API 报错 429 怎么办?4 种方案实测,最后一种改一行代码就搞定
  • spring boot 3.5+flowable7+java 21流程引擎测试程序
  • TVA在精密制造领域的应用案例(11)
  • LFM2.5-1.2B-Thinking-GGUF惊艳效果:在无微调条件下,对半导体工艺术语解释准确率达91.7%
  • 零基础也能搞定!gte-base-zh嵌入模型一键部署与相似度比对实战
  • ArduinoJoystickLibrary 按钮映射完全教程:32个按钮的智能配置技巧
  • EcomGPT-7B实战教程:电商ERP系统对接Gradio API实现商品信息自动填充
  • WindowsCleaner:快速解决C盘爆红的终极免费工具
  • 如何在iOS 15-16上快速绕过iCloud激活锁:applera1n完整指南
  • 降AI率工具哪个好?三款主流工具实测对比看完不再纠结
  • Python一键批量合并多个Excel表格,职场办公高效神器
  • 4.我看了问题汇总,还是不会打开/不会导入原理图怎么办?
  • MySQL主从延迟诊断与优化实战
  • Translumo屏幕翻译工具:打破语言障碍的智能解决方案
  • nomic-embed-text-v2-moe实战教程:嵌入向量持久化到FAISS/Chroma向量库
  • Fish-Speech-1.5儿童语音合成效果展示
  • GME-Qwen2-VL-2B-Instruct快速上手:图文匹配工具与Notion/Airtable双向同步方案
  • Claude读论文系列(十)
  • 降AI率工具哪个好用?嘎嘎降AI vs 比话降AI vs 率零深度PK
  • 从游戏存档到网络通信:详解Unity C#中拆装箱对性能的实际影响与解决方案
  • Qwen3-14B私有镜像赋能Notepad++等轻量编辑器:实现基础AI编程辅助
  • 终极解决方案:Scroll Reverser如何彻底解决Mac滚动方向混乱问题
  • YOLOv1深度解析:核心知识点、优势与局限
  • 探秘向量引擎新玩法:API、Key中转站震撼升级,零基础也能秒建高效AI系统
  • 多年没写代码的管理者,用AI重出江湖?先别急