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

Python:正则表达式相关整理

最近因为一些原因频繁使用正则表达式,因为以前系统整理过关于正则表达式的相关知识,所以这里仅记录使用期间遇到的问题。
本文内容基于re

1. match和search方法的区别

  在Python中,re.searchre.match都是用于匹配字符串的正则表达式函数,但二者在匹配模式上有明显的区别。具体如下:

  • re.match: 该函数只在字符串的开始位置进行匹配。如果开头不匹配,就不会继续匹配下去。其作用类似于从字符串的开位置起寻找能找到符合正则表达式模式的子串。
  • re.search: 该函数会在整个字符串中搜索,直到找到一个匹配的子字符串。其作用类似于从完整的字符串中找到与正则表达式完整匹配的子串。

代码举例如下:

import re
rule=r'(ab|cd).*(ef|gh)' #以ab或cd开头,以ef或gh结尾的字符串
str1='abef'
str2="dcabefabef"
str3="abxyefabstefsc"
print(re.match(rule,str1)) 
print(re.match(rule,str2)) 
print(re.match(rule,str3)) 
print(re.search(rule,str1)) 
print(re.search(rule,str2))
print(re.search(rule,str3)) 

其代码执行结果如下:

<re.Match object; span=(0, 4), match='abef'>
None
<re.Match object; span=(0, 12), match='abxyefabstef'>
<re.Match object; span=(0, 4), match='abef'>
<re.Match object; span=(2, 10), match='abefabef'>
<re.Match object; span=(0, 12), match='abxyefabstef'>

从执行结果中可以发现,这两个方法的返回类型是一样的。
另外,使用^$可以验证完整的字符串是否符合正则表达式规定的模式。具体举例如下:

rule=r'^(ab|cd).*(ef|gh)$' #以ab或cd开头,以ef或gh结尾的字符串
str1='abef'
str2="dcabefabef"
print(re.match(rule,str1)) 
print(re.match(rule,str2)) 
print(re.search(rule,str1)) 
print(re.search(rule,str2))

其执行结果如下:

<re.Match object; span=(0, 4), match='abef'>
None
<re.Match object; span=(0, 4), match='abef'>
None
2. 利用正则表达式实现某些字符必须出现某些字符不能出现的效果

  组合使用零宽断言可以实现利用利用正则表达式实现某些字符必须出现某些字符不能出现的效果。具体举例如下:

rule=r'^(?=.*(ab|cd))(?!.*xy).*$' #ab或cd必须出现,且不能包含xy
str1="132ab23re"
str2="sefeabsefewxyseid"
str3="xyseqeqab"print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))

其结果如下:

<re.Match object; span=(0, 9), match='132ab23re'>
None
None

但是在使用这种方式的时候要注意一点(ab|cd)的后面不要添加.*, 这个需要放到xy的前面,否则实现不了同样的效果,展示如下:

import rerule=r'^(?=.*(ab|cd).*)(?!xy)$'
str1="132ab23re"
str2="sefeabsefewxyseid"
str3="xyseqeqab"print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))

其执行结果如下:

None
None
None

从结果中我们可以看到,str1和str2是符合要求但结果并没有匹配上。
另外,在这种情况下^$的使用也需要注意,如果不添加这两种断言,结果可能也是错误的。展示如下:

import rerule=r'(?=.*(ab|cd))(?!.*xy)'
str1="132ab23re"
str2="sefeabsefewxyseid"
str3="xyseqeqab"print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))

其结果如下:

<re.Match object; span=(0, 0), match=''>
None
None

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • volatile关键字详解
  • 核密度估计KDE和概率密度函数PDF(深入浅出)
  • 智能家居开发新进展:乐鑫 ESP-ZeroCode 与亚马逊 ACK for Matter 实现集成
  • Python高级(四)_内存管理
  • 在VSCode上创建Vue项目详细教程
  • WIN11实现链路聚合/端口聚合
  • 华为HCIP Datacom H12-821 卷38
  • WPF透明置顶窗口wine适配穿透问题解决
  • 【探索LangGraph:构建多专家协作模型】
  • Eureka: Netflix开源的服务发现框架
  • 简谈设计模式之原型模式
  • conda install问题记录
  • 昇思25天学习打卡营第19天|应用实践之基于MobileNetv2的垃圾分类
  • Rust vs Go: 特点与应用场景分析
  • 音视频入门基础:H.264专题(12)——FFmpeg源码中通过SPS属性计算视频分辨率的实现
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【个人向】《HTTP图解》阅后小结
  • HTTP 简介
  • Javascript弹出层-初探
  • JavaScript异步流程控制的前世今生
  • laravel with 查询列表限制条数
  • SpingCloudBus整合RabbitMQ
  • swift基础之_对象 实例方法 对象方法。
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 好的网址,关于.net 4.0 ,vs 2010
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端自动化解决方案
  • 想写好前端,先练好内功
  • 应用生命周期终极 DevOps 工具包
  • Semaphore
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 数据可视化之下发图实践
  • ######## golang各章节终篇索引 ########
  • #HarmonyOS:基础语法
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #职场发展#其他
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (全注解开发)学习Spring-MVC的第三天
  • (十六)串口UART
  • (十一)手动添加用户和文件的特殊权限
  • (四)js前端开发中设计模式之工厂方法模式
  • (转)jdk与jre的区别
  • (转)Scala的“=”符号简介
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .Net Core与存储过程(一)
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .NET6实现破解Modbus poll点表配置文件
  • .pop ----remove 删除