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

8. 正则表达式

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

    符号匹配位置
    ^行的开始
    $行的结尾
    • ^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())
    

相关文章:

  • Linux路由设置
  • HTTP/HTTPS Testing Magic Tool GO-VCR
  • Linux网络-自定义协议、序列化和反序列化、网络计算服务器的实现和Windows端客户端
  • 如何在快团团上找到优质的供货团长和挑选合适的产品进行推广?
  • Django与MySQL:配置数据库的详细步骤
  • windows环境安装多版本jdk与环境切换
  • LeetCode | 1470.重新排列数组
  • 如何将HTTP升级成HTTPS?既简单又免费的方法!
  • 从0开发一个Chrome插件:核心功能开发——内容脚本
  • ChatGPT-4o在临床医学日常工作、数据分析与可视化、机器学习建模中的技术
  • python数据分析-心脏衰竭分析与预测
  • stm32 启动文件分析
  • vsCode双击文件才能打开文件,单击文件只能预览?
  • 在Windows11系统上搭建SFTP服务器
  • 代码随想录算法训练营day43
  • php的引用
  • “大数据应用场景”之隔壁老王(连载四)
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • chrome扩展demo1-小时钟
  • EOS是什么
  • Git同步原始仓库到Fork仓库中
  • javascript 哈希表
  • Java超时控制的实现
  • KMP算法及优化
  • MySQL-事务管理(基础)
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python打包系统简单入门
  • underscore源码剖析之整体架构
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 初探 Vue 生命周期和钩子函数
  • 搞机器学习要哪些技能
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 因为阿里,他们成了“杭漂”
  • 在Unity中实现一个简单的消息管理器
  • zabbix3.2监控linux磁盘IO
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​queue --- 一个同步的队列类​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • $refs 、$nextTic、动态组件、name的使用
  • (35)远程识别(又称无人机识别)(二)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (简单) HDU 2612 Find a way,BFS。
  • (未解决)macOS matplotlib 中文是方框
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)linux 命令大全
  • (转)为C# Windows服务添加安装程序
  • ***检测工具之RKHunter AIDE
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core中的时区转换问题
  • .NET Micro Framework初体验