正则表达式

匹配类符号

  1. 什么是正则表达式

    正则表达式是一种可以让复杂得字符串问题变得简单的工具
    正则并不是python特有的语法(不属于python),所有的高级编程语言都支持正则,正则的语法通用
    不管通过正则表达式解决的是什么问题,写正则的时候都是在使用正则表达式描述字符串规则

  2. Python的re模块

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

    fullmatch(正则表达式, 字符串) - 判断正则表达式和指定字符串是否完全匹配(判断整个字符串是否符合正则表达式所描述的规则)

  3. 正则语法 - 匹配类符号

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

匹配次数

from re import fullmatch# 1.* - 0次或多次(任意次数)
# 注意:*在谁后面控制的就是谁的次数
"""
a* - 0个或多个a
\d* - 0个或多个\d
"""
result = fullmatch(r'a*123', 'aaaaaaa123')
print(result)
result = fullmatch(r'\d*abc', '11234abc')
print(result)
result = fullmatch(r'[MN]*abc', 'NMabc')
print(result)
# 2.+ - 1次或者多次(至少一次)
result = fullmatch(r'a+123', 'a123')
print(result)
# 3.? - 0次或1次
result = fullmatch(r'A?123', 'A123')
print(result)
# 4.{}
"""
{M,N} - M到N次
{M,}  - 至少M次
{,N}  - 最多N次
{N}   - N次
"""
result = fullmatch(r'[a-z]{3,5}123', 'absds123')
print(result)
result = fullmatch(r'[a-z]{3,}123', 'absdsdfgsdf123')
print(result)
result = fullmatch(r'[a-z]{,3}123', 'a123')
print(result)
result = fullmatch(r'[a-z]{8}123', 'absdasdf123')
print(result)# 练习:写一个正则,判断输入的内容是否是一个合法的QQ号(长度是5~12位的数字,第一位不能是0)
def f1(qq: str):return bool(fullmatch(r'[1-9]\d{4,11}', qq))qq = input('请输入一个qq:')
print(f1(qq))# 练习:判断输入的内容是否是一个合法的标识符(由字母、数字下划线组成,数字不能开头)
def f2(str1: str):return bool(fullmatch(r'[a-zA-Z_][\da-zA-Z_]*', str1))str1 = input('请输入一个标识符:')
print(f2(str1))

贪婪非贪婪

from re import match# match(正则表达式, 字符串) - 判断字符串开头是符合正则表达式描述的规则
result = match(r'\d{3}', '234hkdfjk')
print(result)
  1. 贪婪和反贪婪

    当匹配次数不确定的时候(、+、?、{M,N}、{N,}、{,N}),匹配模式分为贪婪和非贪婪两种,默认是贪婪的
    贪婪和非贪婪:在匹配成功的时候有多种匹配结果,贪婪取最多次数对应的匹配结果,非贪婪取最少次数对应的匹配结果
    (匹配次数不确定的地方,有多种匹配方式都可以匹配成功,贪婪取最多次数,非贪婪取最少次数)
    贪婪模式:
    、+、?、{M,N}、{N,}、{,N}
    非贪婪模式:*?、+?、{M,N}?、{N,}?、{,N}?

    # 1)示例1:
    # 贪婪模式
    result = match(r'a.+b', 'ambcbdb')
    print(result)
    # 反贪婪模式
    result = match(r'a.+?b', 'ambcbdb')
    print(result)
    # 注意:如果匹配结果只有一种可能,那么贪婪和非贪婪的结果一样
    # 贪婪模式
    result = match(r'a.+b', 'ambc')
    print(result)
    # 反贪婪模式
    result = match(r'a.+?b', 'ambc')
    print(result)
    

分组和分支

  1. 分组 - ()

    1)整体 - 将正则表达式中的一部分作为一个整体进行相关操作
    2)重复 - 可以在正则表达式中通过\M来重复它前面的第M个分组的匹配结果
    3)捕获 - 只获取正则表达式中的一部分匹配到的结果(分为手动和自动捕获两种)

    from re import fullmatch, findall# findall(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串# '12DF45ER65ER45WE'
    result = fullmatch(r'(\d\d[A-Z]{2})+', '12DF45ER65ER45WE')
    print(result)
    # 23m23、98k98、12p12 - True
    # 23m34、98k18 - False
    result = fullmatch(r'(\d{2})[a-z]\1[a-z]\1', '12d12d12')
    print(result)
    result = fullmatch(r'(\d{2})([a-z]{3})=\2\1{3}', '12abc=abc121212')
    print(result)
    # \M只能重复在它之前的分组内容,无法重复在它之后出现的内容
    # result = fullmatch(r'(\d{2})\1=\2([a-z]{3})', '12abc=abc12')  # 报错!
    result = fullmatch(r'(\d{2})\1=([a-z]{3})\2', '1212=abcabc')
    print(result)
    # 提取message中金额对应的数字子串
    message = '我今年18岁,月薪500000元,身高180,体重70公斤,8块腹肌。每年交300元的腾讯会员费,房贷每月3000元,车贷每月2200元。'
    result = findall(r'(\d+)元', message)
    print(result)  # ['500000', '300', '3000', '2200']
    
  2. 分支 - |

    正则1|正则2|正则3|… - 匹配可以和多个正则中任意一个正则匹配的字符串

    匹配一个字符串是三个数字或者两个小写字母

    result = fullmatch(r'\d{3}|[a-z]{2}', '234')
    print(result)
    # a236b、amvb
    result = fullmatch(r'a\d{3}b|a[a-z]{2}b', 'amvb')
    print(result)
    # 注意:如果想要正则表达式中的一部分实现多选一的效果,变化的部分用分组表示
    result = fullmatch(r'a(\d{3}|[a-z]{2})b', 'amvb')
    print(result)
    

转义符号

  1. 转义符号

    正则中转义字符,就是在本身具备特殊功能或者特殊意义的符号前加’',让这个符号变成一个普通符号。

    # 匹配任意一个小数对应的字符串
    result = fullmatch(r'\d+\.\d+', '23.897')
    print(result)
    # +123、+5456
    result = fullmatch(r'\+\d+', '+123456')
    print(result)
    # (mv)、(ahsjkd)
    result = fullmatch(r'\([a-z]+\)', '(msk)')
    print(result)
    result = fullmatch(r'\\\d+', r'\465654654')
    print(result)
    
  2. []里面的转义符号

    单独存在有特殊意义的符号(+、*、?、.等),在[]中特殊意义自动消失

    result = fullmatch(r'\d+[.]\d+', '23.897')
    print(result)
    # 本身在中括号中有特殊功能的符号,如果要表示普通符号必须加'\'
    result = fullmatch(r'a[M\-N]b', 'a-b')
    print(result)
    result = fullmatch(r'a[MN-]b', 'a-b')
    print(result)
    result = fullmatch(r'a[\^MN]b', 'a^b')
    print(result)
    result = fullmatch(r'a[MN^]b', 'a^b')
    print(result)
    

检测类符号

  1. \b - 检测是否是单词边界

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

    result = fullmatch(r'abc\b mn', 'abc mn')
    print(result)
    message = '203mn45,89 mn12de;99mll==910,230 90='
    result = findall(r'\d+', message)
    print(result)  # ['203', '45', '89', '12', '99', '910', '230', '90']
    result = findall(r'\d+\b', message)
    print(result)  # ['45', '89', '910', '230', '90']
    result = findall(r'\b\d+', message)
    print(result)  # ['203', '89', '99', '910', '230', '90']
    result = findall(r'\b\d+\b', message)
    print(result)  # ['89', '910', '230', '90']
    
  2. \B - 检测是否不是单词边界

    result = findall(r'\B\d+\B', message)
    print(result)  # ['89', '910', '230', '90']
    
  3. ^ - 检测是否是字符串开头

    result = findall(r'^\d+', message)
    print(result)  # ['203']
    # 提取字符串前5个字符
    result = findall(r'^.{5}', message)
    print(result)  # ['203mn']
    
  4. $ - 检测是否是字符串结尾

    # 提取字符串最后5个字符
    result = findall(r'.{5}$', message)
    print(result)  # ['0 90=']
    

re 模块

  1. 常用函数

    from re import *# 1)fullmatch(正则表达式, 字符串) - 完全匹配,判断整个字符串是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回空
    result = fullmatch(r'abc', 'abc')
    print(result)
    # 2)match(正则表达式, 字符串) - 匹配字符串开头,判断字符串开头是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回空
    result = match(r'abc', 'abc12345')
    print(result)
    # 3)search(正则表达式, 字符串) - 获取字符串中第一个能够和正则匹配成功的子串,能够找到返回匹配对象,匹配失败返回空
    result = search(r'1', '1a1b1c')
    print(result)
    # 4)findall(正则表达式, 字符串) - 获取字符串中所有满足正则的子串,返回一个列表,列表中的元素是字符串。
    # 注意:如果正则表达式中有分组,会针对分组做自动捕获(只获取分组匹配到的结果)
    result = findall(r'1', 'a1b1c1')
    print(result)
    # 5)finditer(正则表达式, 字符串) - 获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是每个字串对应的匹配结果
    result = finditer(r'1', 'a1b1c1')
    print(result)
    # 6)split(正则表达式, 字符串) - 将字符串中所有满足正则的子串作为切割点对字符串进行切割
    result = split(r'\\\d+', r'\1abc\2abc\56abc\789abc')
    print(result)
    # 7)sub(正则表达式, 字符串1, 字符串2) - 将字符串2中所有满足正则的子串都替换成字符串1
    result = sub(r'\\\d+', '-', r'\1abc\2abc\56abc\789abc')
    print(result)
    print('分割线:', '==' * 50)
    
  2. 匹配对象

    result = search(r'(\d{3})([A-Z]{2})', 'jsdha123mn123ASasfda125OPp')
    print(result)
    # 1)直接获取整个正则表达式对应的匹配结果:匹配对象.group()
    print(result.group())  # 123AS
    # 2)手动捕获某个分组对应的匹配结果:匹配对象.group(分组数)
    print(result.group(1))  # 123
    print(result.group(2))  # AS
    # 3)获取匹配结果在原字符串中的位:匹配对象.span()
    print(result.span())  # (10, 15)
    print(result.span(2))  # (13, 15)
    
  3. 参数

    # 1)匹配忽略大小写:(?i)
    result = fullmatch(r'(?i)abc', 'aBC')
    print(result)
    # 2)单行匹配:(?s)
    """
    多行匹配:匹配的时候.不能和换行(\n)进行匹配
    单行匹配:匹配的时候.可以和换行(\n)进行匹配
    """
    result = fullmatch(r'(?s)abc.123', 'abc\n123')
    print(result)
    

day-17正则表达式相关推荐

  1. Java学习-17 正则表达式简述

    Java学习-17 正则表达式 1.什么是正则表达式? 正则表达式是构成搜索模式(search pattern)的字符序列. 当您搜索文本中的数据时,您可使用搜索模式来描述您搜索的内容. 正则表达式可 ...

  2. 7.17正则表达式与re模块

    正则表达式 这里介绍的只是正则的一点点皮毛,如果要详细了解可以看书<正则指引> 1.re模块与正则表达式之间的关系 (1)正则表达式不是python独有的,它是一门独立的技术 (2)所有的 ...

  3. 7.17 正则表达式 re模块

    在介绍正则表达式和re模块之前,先简要介绍一下 正则表达式与re模块的关系 1.正则表达式是一门独立的技术,任何语言均可使用 2.python中要想使用正则表达式需要通过re模块 正则表达式 元字符 ...

  4. 彻底掌握 Javascript(八)正则表达式【讲师辅导】-曾亮-专题视频课程

    彻底掌握 Javascript(八)正则表达式[讲师辅导]-1335人已学习 课程介绍         任何一种语言,正则表达式可以说是功能,程序员也必须必须必掌握.通过它,你可以把 string 玩 ...

  5. 步步为营-55-js练习

    1:加法计算器 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...

  6. python密码学编程pdf-Python密码学编程 PDF 下载

    相关截图: 资料简介: Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言.同时,Python语言在算法领域也得到了很好的应用.本书通过理论和实例相结合的方 ...

  7. linux 有用的命令,linux有用命令(持续更新)

    1.统计重复行的个数 如:uid.txt aaa bbb bbb aaa sort uid.txt | uniq -c得到 2 aaa 2 bbb 2.查看压缩文件 a.gz, b.gz, c.gz ...

  8. 有意思的记录-shell(持续更新)

    1.统计重复行的个数 sort uid.txt | uniq -c 2.查看压缩文件 cat *.gz | gunzip > 123 3.查看2个文件的交集.差集 comm用于比较两个有序文件, ...

  9. 深入理解ES6 pdf

    下载地址:网盘下载 目录  · · · · · · 第1章 块级作用域绑定 1 var声明及变量提升(Hoisting)机制 1 块级声明 3 -- let声明 3 -- 禁止重声明 4 -- con ...

  10. php课程设计实验心得,PHP程序设计教程实验及课程设计

    部分 教程 1 基础教程 1.1 简介 1.2 WampServer安装 1.3 PHP语法 1.4 变量 1.5 echo和print语句 1.6 数据类型 1.7 字符串函数 1.8 常量 1.9 ...

最新文章

  1. mysql5.7忘记root密码的修改方法
  2. ListView添加项目
  3. 6、CSS Id 和 Class类选择器
  4. 小师妹学JVM之:JIT中的LogCompilation
  5. gitl更新最近代码_常见的蓝屏代码以及解决方法
  6. jQuery学习笔记:事件
  7. 静态内部类实现 单例模式
  8. 只要实现了annotation这个接口就是注解 同理:只要实现了某个接口就是该类型的实现类...
  9. 浅析天际网、IT260、微人脉等中国职业社交网站
  10. Python新闻网站项目-3.Gerapy爬虫分布式部署
  11. mysql每五分钟取一次数据_mysql – 给定时间内每5分钟的平均数据
  12. 小孩终生教育工程(人生管理):有些东西比努力比钱更重要
  13. Handsontable 给力的仿Excel JQuery插件
  14. win10设置pin一直转圈_Win10 自带手机投屏功能,80% 的人居然都不知道
  15. Oracle学习——第二讲(函数)
  16. 2019小米java开发
  17. java连接access数据库的三种方式以及远程连接
  18. Activemq的集群
  19. 燕国胜国际会议英文介绍翻译
  20. 游戏引擎不仅是代码,更多的是完善的工具

热门文章

  1. request.getHeader、request.getHeaders、request.getHeaderNames
  2. win10磁盘占用100%
  3. mac os linux pageup pagedown,[整理]Mac中的类似于Windows中的PageUp和PageDown以及Ctrl+Home和Ctrl+End...
  4. Java实现单向链表基本功能
  5. 3万亿背后 阿里正在造全球通用计算机
  6. 联合概率数据关联JPDAF详解
  7. BibTeX的使用方法
  8. python改变图像颜色_通过python改变图片特定区域的颜色详解
  9. 人工智能课后作业_python实现广度优先遍历搜索(BFS)(附源码)
  10. 并查集算法(有趣的讲解)