正则表达式

一、定义

正则表达式:一种可以让一些复杂字符串问题变简单的工具。

注意:所有的高级编程语言都支持正则,正则的语法通用。不是Python特有的。

二、匹配类符号

  • re模块:Python用来支持正则表达式的一个模块,模块中包含了所有和正则相关的函数。

    fullmatch(正则表达式, 字符串)

    判断正则表达式和指定的字符串是否完全匹配。(判断字符串是否符合正则表达式描述的规则)
    匹配成功返回匹配对象,匹配失败返回None。
    
    # 导入re模块中的fullmatch方法
    from re import fullmatch
    
  • 匹配类符号语法

    1)普通符号:正则表达式表达符号本身的符号。
    2).:匹配任意一个字符
    3)\d:匹配任意一个数字字符
    4)\s:匹配任意一个空白字符
    5)\D:匹配任意一个非数字字符
    6)\S:匹配任意一个非空白字符
    7)[字符集]:匹配字符集中任意一个字符[abc] - 匹配a或者b或者c[abc\d] - 匹配a或者b或者c或者任意一个数字[1-9] - 匹配1-9中任意一个数字[a-z] - 匹配任意一个小写字母[A-Z] - 匹配任意一个大写字母[a-zA-Z\d_] - 匹配字母数字或者下划线[\u4e00-\u9fa5] - 匹配任意一个中文字符注:[]中减号放在两个字符之间表示谁到谁(确定的方式是根据字符编码值大小确定的);如果减号不在两个字符之间表示普通的减号。8)[^字符集]:匹配不在字符集中任意一个字符,^只能放在最前面
    
    from re import fullmatch# 1)普通符号:正则表达式表达符号本身的符号。
    result = fullmatch(r'abc', 'abc')
    print(bool(result))   # True# 2).  -  匹配任意一个字符
    result = fullmatch(r'a.c', 'acc')
    print(bool(result))   # True# 3)\d  -  匹配任意一个数字字符
    result = fullmatch(r'a\dc', 'a0c')
    print(bool(result))   # True# 4)\s  -  匹配任意一个空白字符
    # 空白字符  -  能产生空白效果的字符,例如:空格、换行、水平制表符
    result = fullmatch(r'a\sc', 'a c')
    print(bool(result))   # Trueresult = fullmatch(r'a\sc', 'a\tc')
    print(bool(result))   # Trueresult = fullmatch(r'a\sc', 'a\nc')
    print(bool(result))   # True# 5)\D  -  匹配任意一个非数字字符
    result = fullmatch(r'a\Dc', 'abc')
    print(bool(result))   # True# 6)\S  -  匹配任意一个非空白字符
    result = fullmatch(r'a\Sc', 'a c')
    print(bool(result))    # False# 7)[字符集]:匹配字符集中任意一个字符
    result = fullmatch(r'x[a-zA-Z\u4e00-\u9fa5-]h', 'x-h')
    print(bool(result))   # True# 8)[^字符集]:匹配不在字符集中任意一个字符,^只能放在最前面
    result = fullmatch(r'x[^\d]h', 'x是h')
    print(bool(result))   # True
    

三、匹配次数

  • *: 0次或多次(任意次数);

    :星号在谁后面控制谁的次数

    result = fullmatch(r'a*123', '123')
    print(bool(result))  # Trueresult = fullmatch(r'a*123', 'aaaa123')
    print(bool(result))  # True
    
  • +:1次或者多次(至少一次)

    result = fullmatch(r'[MN]+abc', 'abc')
    print(bool(result))  # Falseresult = fullmatch(r'[MN]+abc', 'MNNMabc')
    print(bool(result))  # True
    
  • ?:0次或1次

    result = fullmatch(r'A?abc', 'abc')
    print(bool(result))  # Trueresult = fullmatch(r'A?abc', 'Aabc')
    print(bool(result))  # Trueresult = fullmatch(r'A?abc', 'AAabc')
    print(bool(result))  # False
    
  • {}

    {M,N}    -    M到N次
    {M,}    -    至少M次
    {,N}    -    最多N次
    {N}    -    N次
    
    result = fullmatch(r'[a-z]{3,5}123', 'asdf123')
    print(bool(result))    # Trueresult = fullmatch(r'[a-z]{3,}123', 'asdfssss123')
    print(bool(result))    # Trueresult = fullmatch(r'[a-z]{,5}123', 'asdf123')
    print(bool(result))    # Trueresult = fullmatch(r'[a-z]{3}123', 'asdf123')
    print(bool(result))    # False
    
  • 贪婪和非贪婪

    当匹配次数不确定(*、+、?、{M,N}、{M,}、{,N})时,匹配模式分为贪婪和非贪婪两种。默认贪婪。
    
    1.贪婪:匹配成功时有多种匹配结果,贪婪取最多次数对应的匹配结果。(匹配次数不确定的地方,有多种匹配方式都可以匹配成功,贪婪取最多次数)
    贪婪模式:*、+、?、{M,N}、{M,}、{,N}
    
    # 贪婪
    result = match(r'a.+b', 'amb互换bfjbmi')
    print(result)    # match='amb互换bfjb'# 注意:如果匹配结果只有一种可能,贪婪和非贪婪的结果一样。
    # 贪婪
    result = match(r'a.+b', 'amb互换')
    print(result)    # match='amb'
    
    2.非贪婪:匹配成功时有多种匹配结果,贪婪取最少次数对应的匹配结果。(匹配次数不确定的地方,有多种匹配方式都可以匹配成功,贪婪取最少次数)非贪婪模式:*?、+?、??、{M,N}?、{M,}?、{,N}?
    
    # 非贪婪
    result = match(r'a.*?b', 'amb互换bfjbmi')
    print(result)    # match='amb'# 注意:如果匹配结果只有一种可能,贪婪和非贪婪的结果一样。
    # 贪婪
    result = match(r'a.+b', 'amb互换')
    print(result)    # match='amb'# 非贪婪
    result = match(r'a.*?b', 'amb互换')
    print(result)    # match='amb'
    

四、分组和分支

  • 分组

    1)整体:将正则表达式中的一部分作为一个整体进行相关操作。
    2)重复:可以在正则表达式中通过\M来重复它前面的第M个分组的匹配结果。不能重复\M之后出现的内容(否则会报错!)。
    3)捕获:只获取正则表达式中分组的一部分匹配到的结果(分为手动和自动捕获两种)
    
    # 导入fullmatch模块和findall模块
    from re import fullmatch, findall# 2.重复
    # 例子1:两个数字两个大写字母重复
    result = fullmatch(r'(\d\d[A-Z]{2})+', '22WE35SD')
    print(result)# 例子2:23d23 45t45
    result = fullmatch(r'(\d{2})[a-z]\1', '45t45')
    print(result)# 例子3:23dfg=dfg232323(重复两个分组)
    result = fullmatch(r'(\d{2})([a-z]{3})=\2\1{3}', '23dfg=dfg232323')
    print(result)# 3.捕获
    message ='我今年18岁,月薪50000元,身高180,体重70公斤,8块腹肌。每年交300元的腾讯会员费。房贷每月3000元,车贷每月2280元。'
    result = findall(r'(\d+)元',message)
    print(result)   # ['50000', '300', '3000', '2280']
    
  • 分支:|(或者)

    正则1|正则2|正则3|...:匹配可以和多个正则中任意一个正则匹配的字符串。
    
    # 例子
    # 匹配三个数字或两个字母
    result = fullmatch(r'\d{3}|[a-z]{2}', 'ed')
    print(bool(result))    # True# a两个数字d、a三个字母d
    # 注:如果想要正则表达式中的一部分实现多选一功能,变化的部分用分组表示。
    result = fullmatch(r'a(\d{3}|[a-z]{2})d', 'a123d')
    print(bool(result))    # True
    

五、转义符号

  • 转义符号

    在本身具备特殊功能或特殊意义的符号前加'\',让这个符号变成普通符号。
    
    # .具备特殊意义,所以前面加个\
    result = fullmatch(r'\d+\.\d+', '23.89')
    print(bool(result))    # True# +具备特殊意义
    result = fullmatch(r'\+\d+', '+123329')
    print(bool(result))    # True# ()具备特殊意义
    result = fullmatch(r'\([A-Z]+\)', '(ASJDSJI)')
    print(bool(result))    # True
    
  • []里的转义符号

    1)单独存在有特殊意义的符号(+、*、?、.等),在[]中特殊意义会自动消失。
    2)本身在中括号中有特殊功能的符号(-、^),如果表示普通符号必须加'\'。
    
    # 1)单独存在有特殊意义的符号(+、*、?、.等),在[]中特殊意义会自动消失
    result = fullmatch(r'\d+[.+*?]\d+', '433?444')
    print(bool(result))    # True# 2)本身在中括号中有特殊功能的符号(-、^),如果表示普通符号必须加'\'
    result = fullmatch(r'a[M\-N]b', 'a-b')  # -
    print(bool(result))    # Trueresult = fullmatch(r'a[\^MN]b', 'a^b')   # ^
    print(bool(result))    # True
    

六、检测类符号

检测类符号是在匹配成功的情况下,检测检测类符号所在的位置是否符合符号相关要求。

  • \b: 检测是否是单词边界

    单词边界:可以将两个单词区分开的符号都是单词边界,比如:空白符号、英文标点符号、字符串开头和字符串结尾。

    result = fullmatch(r'abc\b mn', 'abc mn')
    print(result)  # √message = '203mn45,89 四级45kn;23;09mll==333,234 89='
    result = findall(r'\d+', message)
    print(result)    # ['203', '45', '89', '45', '23', '09', '333', '234', '89']result = findall(r'\d+\b', message)   # 右
    print(result)  # ['45', '89', '23', '333', '234', '89']result = findall(r'\b\d+', message)    # 左
    print(result)   # ['203', '89', '23', '09', '333', '234', '89']result = findall(r'\b\d+\b', message)    # 左、右都有
    print(result)    # ['89', '23', '333', '234', '89']
    
  • \B: 检测是否不是单词边界

    message = '203mn45,89 四级45kn;23;09mll==333,234 89='
    result = findall(r'\B\d+\B', message)
    print(result)    # ['03', '4', '45', '9', '3', '3']
    
  • ^: 检测是否是字符串开头

    message = '203mn45,89 四级45kn;23;09mll==333,234 89='
    result = findall(r'^\d+', message)
    print(result)    # ['203']# 提取字符串前十个字符
    message = '203mn45,89 四级45kn;23;09mll==333,234 89='
    result = findall(r'^.{10}', message)
    print(result)    # ['203mn45,89']
    
  • $: 检测是否是字符串结尾

    # 提取字符串后十个字符
    message = '203mn45,89 四级45kn;23;09mll==333,234 89='
    result = findall(r'.{10}$', message)
    print(result)    # ['33,234 89=']
    

七、re模块常用函数

  • 函数

    1.fullmatch(正则表达式,字符串): 完全匹配,判断整个字符串是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回None。

    2.match(正则表达式,字符串): 匹配字符串开头,判断字符串开头是否符合正则表达式描述的规则。

    3.search(正则表达式,字符串): 获取字符串中第一个能够和正则表达式匹配成功的子串。

    4.findall(正则表达式,字符串): 获取字符串中所有满足正则表达式的子串,返回一个元素为字符串的列表;没有则为[]。

    :如果正则表达式有分组,会针对分组做自动捕获(只获取分组匹配到的结果)。

    5.finditer(正则表达式,字符串): 获取字符串中所有满足正则表达式的子串,返回一个迭代器,迭代器中的元素是每个子串对应的匹配结果。

    6.split(正则表达式,字符串): 将字符串中所有满足正则的子串作为切割点对字符串进行切割。

    str1 = '123aMNnb看的价位aIIeea990b=='
    print(str1.split('a'))    # ['123', 'MNnb看的价位', 'IIee', '990b==']# 将a、b作为切割点
    result = split(r'a|b', str1)
    print(result)    # ['123', 'MNn', '看的价位', 'IIee', '990', '==']
    

    7.sub(正则表达式,字符串1,字符串2):将字符串2中所有满足正则的子串都替换成字符串1。

    result = sub(r'\d+', '+', '123aMNnb看的价位aIIeea990b==')
    print(result)    # +aMNnb看的价位aIIeea+b==
    
  • 匹配对象

    result = search(r'(\d{3})([A-Z]{3})', '233SDD556WER')
    print(result)    # <re.Match object; span=(0, 6), match='233SDD'>
    

    1.匹配对象.group(): 直接获取整个正则表达式对应的匹配结果。

    print(result.group())    # 233SDD
    

    2.匹配对象.group(分组数): 手动捕获某个分组对应的匹配结果。

    print(result.group(1))    # 233
    print(result.group(2))    # SDD
    

    3.匹配对象.span(): 获取指定结果在原字符串中的位置。

    print(result.span())    # (0, 6)
    print(result.span(2))   # (3, 6)
    
  • 参数

    1.匹配忽略大小写: (?i)写在正则表达式前面。

    result = fullmatch(r'(?i)abc', 'ABc')
    print(result)    # <re.Match object; span=(0, 3), match='ABc'>
    

    2.单行匹配: (?s)写在正则表达式最前面。

    多行匹配(默认):匹配时.不能和'\n'进行匹配
    单行匹配:匹配时.可以和'\n'进行匹配
    
    # 多行
    result = fullmatch(r'abc.123', 'abc\n123')
    print(result)    # None# 单行
    result = fullmatch(r'(?s)abc.123', 'abc\n123')
    print(result)    # <re.Match object; span=(0, 7), match='abc\n123'>
    

基础语言-第17天-正则表达式相关推荐

  1. JavaScript基础---语言基础(1)

    写在前面: 通过四篇博客把JS基础中的基础整理一下,方便自己查阅,这些内容对于实际项目开发中也许并不会在意,但是作为JS的语言基础,自觉还是应该熟悉.在完成这三篇博客(JavaScript基础---语 ...

  2. 计算机基础语言学习线路图

    计算机基础语言学习线路图 HTML HTML教程 HTML简介 HTML编辑器 HTML基础 HTML元素 HTML属性 HTML标题 HTML段落 HTML样式 HTML格式化 HTML引用元素 H ...

  3. 第一单元总结:基于基础语言、继承和接口的简单OOP

    前情提要 到目前为止,OO课程已经完成了前三次的作业,分别为: 第一次作业:简单多项式的构造和求导.[正则表达式][数据结构][排序] 第二次作业:含三角函数因子的复杂多项式的构造.求导和化简.[递归 ...

  4. 零基础到进阶,Python正则表达式详解

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  5. 【链块技术10期】区块链基础语言(二)——GO语言开发环境搭建

    ‍原文链接:区块链基础语言(二)--Go语言开发环境搭建 一.操作系统位数的查询方法‍ 在安装前首先要了解个人的电脑系统位数是32位还是64位. 1.1Windows系统查询方法 右击"计算 ...

  6. STM32 基础系列教程 17 – CRC

    前言 学习stm32 循环冗余校验(CRC)计算单元接口使用,学会stm32f103 CRC应用与编程,关于CRC的基础知识请各位自行百度,STM32有些芯片的CRC多项式可自由设定,有些则是固定值0 ...

  7. 首尾非零正则_常用的17种正则表达式

    17种正则表达式 "^\\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\\d+)|(0 ...

  8. 在C语言中巧用正则表达式

    From: http://blog.chinaunix.net/space.php?uid=20435679&do=blog&id=1680220 标准的C和C++都不支持正则表达式, ...

  9. 网页制作的基本语言html,网页制作基础语言HTML.ppt

    网页制作基础语言HTML 2. 内嵌音频播放插件 通过内嵌音频播放插件可以在浏览器中出现控制面板,也可作为背景音乐.其格式为: [例2-27] 3. IE中的背景音乐 可以插入背景音乐格式,不过只有在 ...

最新文章

  1. c语言表达逻辑量的方法,c语言中用什么表示逻辑量为真
  2. Python自然语言处理学习笔记(66):7.7 小结
  3. 【干货】功能堆砌or视觉美观?看优秀PM如何权衡
  4. svn服务器基本知识及搭建
  5. WSO2注册表安装简介
  6. gprs模块ftp 远程升级_基于GPRS无线通信技术的冷链监测系统
  7. 中国开源燃烧!Zilliz 获全球开源基础软件最大单笔融资 4300 万美元
  8. python 序列化模块_Python进阶-XII serialize(序列化)、序列化模块
  9. 数据中心淘汰服务器,浅谈数据中心危机严重的程度
  10. c++ string substr_【函数分享】PHP函数substr ()分享(2020929)
  11. 开发类 - Fiddler 中文版 链接手机 进行抓包
  12. 每天一篇自然语言处理论文:202004
  13. ap设置 维盟660g_WayOS|路由器WAN口数设置详细教程
  14. 短文本分类:电力95598工单分类实现
  15. Solidjs 简介
  16. PDF和CDF图的区别
  17. excel高级筛选怎么用_Excel高级筛选的5个用法,学会了可以少写很多函数公式
  18. 女大学生被骗死亡,各国如何应对电话诈骗?
  19. 怎么查网站反向链接(查反向链接方法)
  20. 基于知识图谱的玉米病虫害知识问答(一)

热门文章

  1. java 自定义注解 校验经纬度
  2. 【Python基础篇015】第叁章模块大全之《os模块》
  3. 日本三大通信商放弃华为设备,是时候做出回应了
  4. Physics Engine - Car Games [ 物理引擎 - 赛车游戏 ]
  5. Mysql基础学习Day01
  6. SCU 4438 字符串哈希
  7. Python基础《华氏温度转换摄氏温度》
  8. 让师生“不跑腿”,教育数据治理究竟有何魔力
  9. 华道生物IPO被终止:曾拟募资3.2亿 新希望投资是股东
  10. Go学习笔记 -- 程序实体之变量