8. 正则表达式

news2024/11/27 10:41:33
正则表达式
  • 在处理字符串时,需要查找符合某些复杂规则的字符串,正则表达式就是用于描述这些规则的工具
一、正则表达式语法
  • 行定位符:用来描述字符串的边界 -->用来匹配一整行

    符号匹配位置
    ^行的开始
    $行的结尾
    • ^tm : 可以匹配行 tm equal Tomorrow Moon
    • tm$:可以匹配行 Tomorrow moon tm
  • **元字符:**用来匹配的字符标记

    代码说明
    .匹配除换行外的任意字符
    \w匹配字母、数字、下划线、汉字
    \s匹配任意空白符
    \d匹配数字
    \b匹配单词的开始、结束
    • \bmr\w*\b:匹配一个以mr为开头的单词,比如:mrsoft、mr123456
  • **重复:**用来匹配特定数量的元字符,称作限定符

    限定符说明举例
    ?匹配前面的字符一次、零次colou?r --> 匹配color、colour
    +匹配前面的字符一次、多次go+gle --> 匹配范围gogle ~ go…gle
    *匹配前面的字符零次、多次go*gle --> 匹配范围ggle ~ go…gle
    {n}匹配前面的字符n次go{2}gle --> 匹配google
    {n,}匹配前面的字符至少n次go{2,}gle --> 匹配范围 google ~ goo…gle
    {n, m}匹配前面的字符[n, m]次employe{0,2} --> 匹配employ, employe, employee
  • **字符类:**用来匹配没有预定义元字符的字符集合,使用[] 列举出来即可

    • [aeiou]:匹配任何一个英文元音字母
    • [,?!]:匹配三个符号中的其中一个
    • [0-9]: 匹配一个数字
    • [a-z0-9A-Z]:匹配数字或字母
    • [^a-zA-Z] : 匹配一个不是字母的字符, ^放在括号里面表示排除的意思
    • [\u4e00-\u9fa5]: 匹配一个汉字

    这种字符类的匹配方式,是可以同重复限定符配合使用的

  • 选择字符:匹配包含条件选择逻辑的字符

    • 身份证号:可能为15为全数字、18位全数字、17为数字加x或X

      (^\d{15}$)|(^\d{18}$)|(^\d{17}(x|X)$)
      

      上述使用 | 来表示选择性匹配,使用^ $限定开头和结尾

  • **转义字符:**匹配特殊的元字符,主要是针对 . * ? \ ( ) { }

    • IP地址:格式通常为xxx.xxx.xxx.xxx

      [1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
      

      上述使用 \. 来匹配IP地址中的 .

  • **小括号:**改变功能字符的限定范围

  • (thir | four)th: 匹配 thirth、fourth

  • (\.[1-9]{1,3}){3}:匹配(\.[1-9]{1,3})三次

二、python中的正则表达式

**说明:**python在使用正则表达式时,是将其作为模式字符串使用的,简而言之就是匹配模式是字符串类型,这就导致部分元字符,如\b 会被python解读为python语言的转义字符,故而要使用\\b表示正则模式字符串,为了比较出现大量的特殊字符、反斜杠,常采用原生字符串 r'\b'

  • **匹配字符串:**re模块提供match() search() findall()方法进行字符串匹配

    • 使用match()方法匹配字符串:re.match(pattern, string, [flags]) 从string起始处开始匹配,匹配成功返回Match对象,否则返回None

      import re
      pattern = r'mr_\w+' # 匹配一个mr_开头的字符串
      string = 'MR_SHOP'
      flag = re.I # 不区分大小写
      match = re.match(pattern, string, flag)
      # 输出: <re.Match object; span=(0, 7), match='MR_SHOP'>
      
      string = 'aaaMR_shop'
      print(re.match(pattern, string, flag))
      # 输出: None
      

      通过返回的Match对象可以查看相关数据

      match.start() # 匹配值的起始位置 
      match.end() # 匹配值的结束位置
      match.span() # 匹配位置的元组
      match.string # 进行匹配的字符串
      match.group() # 匹配得到的结果
      
    • 使用search(pattern, string)方法匹配字符串:该方法用于在整个字符串中搜索第一个匹配值,并返回Match对象,其余与match()方法相同

    • **使用findall(pattern, string)方法匹配字符串:**该方法由于在整个字符串中搜索所有符合正则表达式的字符串,并以列表形式返回匹配结果,而不是Match对象。

    • **替换字符串:**re模块提供sub()方法实现字符串的替换,re.sub(pattern, repl, string, count, flags) 表示按着pattern对string进行匹配,并替换成repl字符串。

    • count: 可选参数–>替换的最大次数,默认为0表示全部替换

    • flags:可选参数 --> 用于控制匹配方式,如是否区分大小写等(flag=re.I表示不区分大小写)

  • **分割字符串:**re模块提供split()方法实现字符串的分割,re.split(pattern, string, [maxsplit], [flags]) 表示按着pattern对string进行分割,返回分割后的列表

    • maxsplit: 可选参数 --> 最大查分次数,默认全拆

    image-20240417183505476

    上述代码展示了,对网址按 ? $进行分割的实现以及具体的结果

三、实战中的相关问题
1. 对txt的每行进行匹配时,输出匹配结果时报错
  • 由于进行匹配时往往会出现匹配失败返回的match为None的情况,就会对Match对象的属性输出报错,比如下述代码,如果没有匹配到那么match就会是None,代码就会报错

    match = re.match(pattern, string, flag)
    print(match.group())
    
  • 正确的做法是加一个检测机制,如下所示,这样就保证了只有正确匹配到时才会输出

    match = re.match(pattern, string, flag)
    if match:
    	print(match.group())
    
  • 正确的做法是加一个检测机制,如下所示,这样就保证了只有正确匹配到时才会输出

    match = re.match(pattern, string, flag)
    if match:
    	print(match.group())
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Recognize Anything: A Strong Image Tagging Model(RAM模型使用方法)

一、RAM模型介绍 这篇论文介绍了一个名为“Recognize Anything Model”&#xff08;RAM&#xff09;的新型基础模型&#xff0c;专用于图像标签识别&#xff08;图像分类&#xff09;。这一模型采用大规模图像-文本配对数据进行训练&#xff0c;无需手动注释&#xff0c;能够在…

Java--可变参数

1.JDK1.5开始&#xff0c;Java支持同类型的可变参数给一个方法 2.在方法声明之前&#xff0c;在指定参数类型后加一个省略号&#xff08;...&#xff09; 3.一个方法只能指定一个可变参数&#xff0c;它必须是方法的最后一个参数&#xff0c;任何普通的参数必须在它之前声明 …

国产操作系统上给virtualbox中win7虚拟机安装增强工具 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上给virtualbox中win7虚拟机安装增强工具 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上给win7虚拟机安装virtualbox增强工具的文章。VirtualBox增强工具&#xff08;Guest Additions&a…

Java----抽象类和接口

欢迎大家来这次博客-----抽象类和接口。 1.抽象类 1.1 抽象类概念 在Java中我们都是通过类来描述对象&#xff0c;但反过来并不是所有的类都是用来描述对象的。当一个类中没有足够的信息来描述一个具体对象&#xff0c;我们就将该类称为抽象类。 如上图中的Shape类&#xff…

《MySQL是怎样运行的》读书笔记(三) B+树索引

前言 从前面数据存储结构中我们已经知道了页和记录的关系示意图: 其中页a、页b、页c ... 页n 这些页可以不在物理结构上相连&#xff0c;只要通过双向链表相关联即可。 在正式介绍索引之前&#xff0c;我们需要了解一下没有索引的时候是怎么查找记录的。下边先只讨论搜索条件…

单源最短路径算法 -- 迪杰斯科拉(Dijkstra)算法

1. 简介 迪杰斯科拉&#xff08;Dijkstra&#xff09;算法是一种用于在加权图中找到最短路径的经典算法。它是由荷兰计算机科学家Edsger Wybe Dijkstra在1956年首次提出的&#xff0c;并以他的名字命名。这个算法特别适合于解决单源最短路径问题&#xff0c;即计算图中一个顶点…

Application Load Balancer-ALB

Application Load Balancer-ALB 什么是ALB开通ALB服务实现IPv4服务的负载均衡创建ALB实例创建服务器组添加后端服务器配置监听设置域名解析&#xff08;可选&#xff09;释放ALB实例 什么是ALB 在介绍ALB之前首先介绍一下负载均衡SLB&#xff0c;可以说SLB是负载均衡家族之首 …

htb-linux-6-beep

nmap web渗透 目录扫描 漏洞关键词 shell py脚本执行 flag root 目前的权限 nmap root

【Unity Shader入门精要 第13章】使用深度和法线纹理(一)

1. 原理 深度纹理的本质是一张RenderTexture&#xff0c;只不过其中记录的不是颜色值&#xff0c;而是一个深度值 这些深度值来自于顶点在空间变换后得到的归一化设备坐标&#xff08;NDC&#xff09;的Z值 由于NDC坐标的分量取值范围在[-1, 1]之间&#xff0c;要使颜色值能…

实现Redis和数据库数据同步问题(JAVA代码实现)

这里我用到了Redis当中的发布订阅模式实现(JAVA代码实现) 先看图示 下面为代码实现 首先将RedisMessageListenerContainer交给Spring管理. Configuration public class redisConfig {AutowiredRedisConnectionFactory redisConnectionFactory;AutowiredQualifier("car…

《精通ChatGPT:从入门到大师的Prompt指南》附录A:常用Prompt示例

附录A&#xff1a;常用Prompt示例 在《精通ChatGPT&#xff1a;从入门到大师的Prompt指南》的附录A中&#xff0c;我们将展示一系列常用的Prompt示例&#xff0c;帮助读者更好地理解和应用Prompt技术。每个示例将包含Prompt的描述、使用场景、预期结果以及实际输出。希望这些示…

Springboot+Vue的网上购物商城系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户商家 功能截图

二、Nginx原来是这样?(系列篇02)

二、Nginx原来是这样&#xff1f;&#xff08;系列篇02&#xff09; 大家好&#xff0c;我是秋意零。 今天分享Nginx系列篇的第二节。Nginx目录结构、运行原理、基本配置。 更多请关注&#xff0c;Nginx系列篇主页&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__b…

MFA 轰炸:苹果用户的攻击目标

一些 Apple (苹果) 用户报告了利用密码重置功能进行的网络钓鱼攻击。 你注意到 iPhone 上的系统提示你输入密码。你点击“不允许”。然后这种情况一次又一次地发生。 在某个时候&#xff0c;你可能会感到恼火或开始恐慌&#xff0c;然后点击“允许”。 然后&#xff0c;你接…

[羊城杯 2023]CSGO

主函数初始化时&#xff0c;有反调试检测 打个断点在前面&#xff0c;然后nop掉 go语言的主函数是main_main 直接来到main_main&#xff0c;发现能可能是base64变表 在前面打个断点&#xff0c;F9 此处为base64变表&#xff0c;来到v25的地址处 得到变表LMNOPQRSTUVWXYZab…

【云原生】Kubernetes----轻量级的现代HTTP反向代理和负载均衡器之Traefik

目录 引言 一、Traefik基本概念 &#xff08;一&#xff09;什么是Ingress &#xff08;二&#xff09;什么是Traefik &#xff08;三&#xff09;Traefik和Nginx的区别 1.设计目标 2.配置语言 3.容器支持 4.功能特性 二、安装部署Traefik &#xff08;一&#xff0…

Redis实战篇02

1.分布式锁Redisson 简单介绍&#xff1a; 使用setnx可能会出现的极端问题&#xff1a; Redisson的简介&#xff1a; 简单的使用&#xff1a; 业务代码的改造&#xff1a; private void handleVoucherOrder(VoucherOrder voucherOrder) {Long userId voucherOrder.getUserI…

NGINX之location和rewrite

一.NGINX常用的正则表达式 二.Location location作用:对访问的路径做访问控制或者代理转发 1.location 常用的匹配规则&#xff1a; 进行普通字符精确匹配&#xff0c;也就是完全匹配^~ / 表示普通字符匹配。使用前缀匹配。如果匹配成功&#xff0c;则不再匹配其它 …

QGraphicsView实现简易地图20『鹰眼视图-全图显示』

前文链接&#xff1a;QGraphicsView实现简易地图19『迁徙图』 鹰眼视图-全图显示 能够显示所有已加载的瓦片地图&#xff0c;支持当前视口的范围显示器。鼠标在鹰眼视图上移动时&#xff0c;支持是否干预主视图地图加载两种模式&#xff0c;即移动时是否让主视图加载空白处的瓦…

无头+单向+非循环链表的实现

这里写目录标题 1. 链表1.1 链表的概念及结构1.2 链表的分类 2. 接口实现3. 链表的实现3.1 打印链表3.2 头插3.3 尾插3.4 头删3.5 尾删3.6 单链表查找3.7 在pos之前插入3.8 在pos之后插入3.9 删除pos位置的值3.10 删除pos位置之后的值3.11 链表的释放3.12 动态申请一个节点 4. …