深入理解正则表达式的工作原理及应用

正则表达式

处理字符串的利器

  • 选用:
    1. 想查看原字符串是否匹配 ->match,fullmatch,search
    2. 想从大字符串中提取指定的子字符串 ——> findall,finditer
      1. 格式:函数(正则表达式,字符串)
      2. 核心:正则表达式整体就是一个具有某一特定规则的字符串,主要是要将想要拿的数据的特定规则写出来
    3. 切割和替换:split,sub
  • 一、匹配

    匹配核心规则:判断后面的字符,是否符合正则表达式描述的规则,符合返回:匹配的字符,不符合返回:None

    1. 正则表达式语法

    1. 匹配类符号

    以下都是针对一个字符的格式判断

    1. 普通符号: – 在正则表达式中表示本身的符号
    2. str1 = ‘abc’
    3. result = fullmatch(r’abc’,str1)
    4. 除了特殊符号,就是普通字符
    5. . : – 表示匹配任意一个字符
    6. result = fullmatch(r’a.c’,str1)
    7. 任意字符,注重要求长度或占位情况
    8. \d : – 匹配任意一个数字字符
    9. result = fullmatch(r’a\dc’,‘123’)
    10. \s : – 匹配任意一个空白字符:例如:空格、换行、水平制表符
    11. \D : – 匹配任意一个非数字字符
    12. \S : – 匹配任意一个非空白字符
    13. \w : – 匹配字母数字下划线,等价于[a-zA-Z0-9_]
    14. \W : – 匹配非数字字母下划线的字符
    15. [字符集]: – 匹配字符集中的任意一个字符(最常用)
    16. 规范:可以连在一起写,合并为一个区间,判断该一个字符在不在这个区间
      1. 写多个其中一个,eg:[abc],字符集中不用写引号
      2. 有特殊字符,eg:[abc\d],匹配任意一个数字或者a/b/c
      3. 区间,小的放前面,大小按照编码值来确定eg:[1-9],[3-9],[a-z],[A-Z],[\u4e00-\u9fa5],[1-9abcA-Z],[1-9a-zA-Z]
      4. 如果减号两边没有字符,那就是普通字符‘-’
      5. '-'号只有在[]里的,且在两个字符中间的时候,有特殊功能表示区间
    17. [^字符集]: – 不在字符集中的任意一个字符
    18. result = fullmatch(r’a[^\u4e00-\u9fa5]b’,‘asb’)

    2. 匹配次数符号:

    统一格式为:匹配符号匹配次数符号.跟在谁后面,就是控制谁

    1. :0次或多次,任意次数。eg:result = fullmatch(r’a*bc’,‘aaaaabc’)
    2. :1次或者多次,至少一次。
    3. ? :1次或0次。
    4. {} : – 最常用
      1. {M,N} – M到N次
      2. {M,} – 至少M次
      3. {,N} – 最多N次
      4. {N} – 就是N次

    3. 贪婪和非贪婪 – 当匹配次数不确定时(*、+、?、{M,N},{M,}、{,N}),匹配模式分为贪婪模式和非贪婪模式两种,默认是贪婪的。

    1. 贪婪:如果匹配成功的时候,有多种匹配结果,贪婪取最多次数对应的匹配结果
    2. *、+、?、{M,N},{M,}、{,N}
    3. 非贪婪:如果匹配成功的时候,有多种匹配结果,贪婪取最多次数对应的匹配结果
    4. 正常匹配次数后面加一个‘?’
    5. *?、+?、??、{M,N}?、{M,}?、{,N}?
    6. 注意:
      1. 要求:必须有多种匹配返回的结果
      2. 举例:fullmatch只有一个结果(原字符串/空),无贪婪情况。match是从原字符串中截取开头,返回开头字符串,可能会有多种开头字符的情况

    4.分组和分支

    1. 分组 – ()、捕获是针对于()来说的

    2. 分组功能:
      1. 表达式重复:将正则中的一部分看成一个整体,进行相关操作。
      2. ‘12MN23MN34KJ…’
      3. result = fullmatch(r’(\d\d[A-Z]{2})+',str1)
      4. 对一个括号整体结构,进行匹配次数操作
      5. 要求某块字符和之前的部分字符的一样:可以在正则表达式中通过\N(\任意正整数)来重复它前面第N个分组的匹配结果(从左边开始数)
      6. str2 = ‘23MKJ==MKJ23’
      7. result = fullmatch(r’(\d{2})([A-Z]{3})==\2\1’,str2)
      8. 只能重复在它之前的分组,不能重复之后的
      9. 捕获: 只获取正则表达式中的分组匹配到的结果
        1. 手动捕获:()里输入组数
        2. 自动捕获: 当findall正则表达式中加入(),先匹配出结果,然后返回匹配结果()中的内容
    3. 分支 – |

      1. 语法:正则1|正则2|正则3|…
      2. 功能: 匹配可以和多个正则中任意一个正则匹配的字符串
      3. 理解:
        1. |分开的是两个正则
        2. ()中加|,是对组内分支。所以如果只想要一部分变化,那就用(部分正则1|部分正则2)
      4. 举例:result=fullmatch(r’\d{3}|[a-z]{2}',‘mk’) –>

    5.转义字符

    1. 正则表达式中有许多有特殊含义的字符,当需要让其表示本身时,前面加一个\进行转义即可
    2. 正则表达式前面的r是为了让正则规则生效,不是原始字符串
    3. 单独存在,有特殊意义的符号,在[]中特殊意义会自动失效

    6. 检测类符号 – 在匹配成功的情况下,检测检测符号所在的位置是否符合要求

    1. \b:检测是否是单词边界
    2. 单词边界:可以将两个单词分开的符号都是单词边界,比如:空白符号、英文标点符号、字符串开头、字符串结尾
    3. 不影响原正则,只是在其上对成功返回的匹配结果,进行进一步筛选。\b
    4. \B:
    5. ^ :检测是否是字符串开头
    6. 预防贪婪,只取前面多少个
    7. findall(r’^.{10}')
    8. $ :检测是否以字符串结尾
    9. 预防贪婪,只取前面多少个
    10. findall(r’.{5}$')

    2. 功能函数

  • python中的re模块: – python用来支持正则表达式的模块,包含了所有和正则相关的函数方法
  • from re import * (想用哪个自己加)
    1. fullmatch(正则表达式,字符串) – 完全匹配;全部字符,挨个对照格式,返回是否匹配

    2. 功能: 判断正则表达式和指定的一个字符串是否完全匹配
    3. 返回值:匹配成功,返回匹配对象,匹配失败,为None
    4. match(正则表达式,字符串)

    5. 功能:判断字符串开头,的若干个字符是否符合正则表达式描述的规则。
    6. 返回值:匹配成功,返回匹配对象(开头子串),匹配失败,为None
    7. search(正则表达式,字符串)

    8. 功能:获取字符串中第一个满足正则的子串
    9. 返回值:找的到,返回该子串;找不到返回None
    10. findall(正则表达式,字符串)

    11. 功能:返回列表,所有满足正则的子串,加进列表里
    12. 返回值:成功,返回一个列表,列表中包含所有满足条件的子串,找不到返回空列表
    13. 特殊:会有自动捕获:一旦正则中出现(),就只输出()中的内容
    14. finditer(正则表达式,字符串)

    15. 功能:同findall
    16. 返回值:成功,返回一个迭代器,迭代器中包含所有符合条件的子串,找不到
    17. split(正则表达式,字符串)

    18. 功能:将字符串中所有满足条件的子串作为切割点
    19. 返回值:成功返回切割后的列表,失败,就是列表中只有一个元素
    20. 举例:
    21. str1 = ‘cdscsuibcacdscsdcc’
    22. result = split(r’a|d’,str1)
    23. sub(正则表达式,字符串1,字符串2)

    24. 功能:将字符串2中所有满足正则的子串都替换成字符串1
  • 3.匹配对象

  • 拿到匹配对象后能干什么:
    1. 获取整个正则表达式对应的匹配结果(match=):result.group()
    2. 手动捕获某个分组对应的匹配结果:result.group(分组数)
    3. 获取匹配结果在原字符串中的位置:result.span(分组数) 分组数可以不写,不写是大的 ,有分组,就发生捕获。都会返回一个元组,(开始下标,结束下标)
  • 4. 参数

    1. 正则匹配忽略大小写
    2. 写法“fullmatch(r’(?i)abc’,aBc) 引号里开头写入(?i)
    3. 单行匹配 :
    4. 多行匹配:匹配时,.不能和换行(\n)进行匹配,需要先将其转化为单行匹配
    5. 方法:引号里的开头加上(?s)
    from re import match
    var = 'abcd'
    result = match(r'ab',var)
    print(result)
    
    <re.Match object; span=(0, 2), match='ab'>
    
    from re import match
    str2 = '23MKJ==MKJ23'
    result = fullmatch(r'(\d{2})([A-Z]{3})==\2\1',str2)
    print(result)
    
    <re.Match object; span=(0, 12), match='23MKJ==MKJ23'>
    
    
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 深入理解正则表达式的工作原理及应用

    发表评论