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

      re 复制代码
      (^\d{15}$)|(^\d{18}$)|(^\d{17}(x|X)$)

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

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

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

  • (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

      python 复制代码
      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对象可以查看相关数据

      python 复制代码
      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: 可选参数 --> 最大查分次数,默认全拆

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

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

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

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

    python 复制代码
    match = re.match(pattern, string, flag)
    if match:
    	print(match.group())
相关推荐
枕布响丸辣1 分钟前
Python 操作 MySQL 数据库从入门到精通
数据库·python·mysql
The_Ticker28 分钟前
印度股票实时行情API(低成本方案)
python·websocket·算法·金融·区块链
ZC跨境爬虫34 分钟前
Scrapy工作空间搭建与目录结构解析:从初始化到基础配置全流程
前端·爬虫·python·scrapy·自动化
EAIReport38 分钟前
国外网站数据批量采集技术实现路径
开发语言·python
Ulyanov42 分钟前
基于ttk的现代化Python音视频播放器:UI设计与可视化技术深度解析
python·ui·音视频
Freak嵌入式1 小时前
MicroPython LVGL基础知识和概念:时序与动态效果
开发语言·python·github·php·gui·lvgl·micropython
zhangzeyuaaa1 小时前
Python 中的 Map 和 Reduce 详解
开发语言·python
七夜zippoe2 小时前
Java技术未来展望:GraalVM、Quarkus、Helidon等新趋势探讨
java·开发语言·python·quarkus·graaivm·helidon
m0_738120722 小时前
网络安全编程——Python编写基于UDP的主机发现工具(解码IP header)
python·网络协议·tcp/ip·安全·web安全·udp
北冥有羽Victoria2 小时前
OpenCLI 操作网页 从0到1完整实操指南
vscode·爬虫·python·github·api·ai编程·opencli