• Python学习三:正则表达式


    一、正则表达式语法

    1.1 行定位符

    开始行定位符^
    结束行定位符&
    
    
    • 1
    • 2
    • 3

    1.2 元字符

    .匹配除了换行符以外的任意字符
    \w匹配字母或数字或下划线或汉字
    \s匹配任意的空白符
    \d匹配数字
    ^匹配字符串的开始
    $匹配字符串的结束

    1.3 重复

    匹配前面的字符0次或者一次
    +匹配前面的字符一次或者多次
    *匹配前面字符0次或者多次
    {n}匹配前面的字符n次
    {n,}匹配前面的字符至少n次
    {n,m}匹配起码面的字符至少n次,最多m次

    1.4 字符类

    就是说匹配一个未知的一个元组集合该怎么办—》使用中括号
    比如匹配0123456789的集合就可以用[0-9]
    匹配u、i、o的集合就可以用[uio]

    匹配任意一个汉字[\u4e00-\u9fa5]
    匹配多个[\u4e00-\u9fa5] +

    1.5 排除字符

    在中括号里面使用^ 就可以了

    ^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)

    比如不匹配0123456789的集合就可以用[^0-9]
    不匹配u、i、o的集合就可以用[^uio]

    1.6 选择字符

    |

    比如身份证是15位或者18位 如果是18位,前面17位都是数字,后面一位可能是X或者x或者数字

    (^\d{15}$)|(^\d{17}$)|(^\d{18}$)|(\d|X|x)$

    1.7 转义字符 \

    1.8 分组()

    改变作用域的范围

    比如(thir|four)th

    不使用用小阔号匹配的是 thir 或者是fourth

    使用用小阔号匹配的是 thirth 或者是fourth

    1.9 在Python中使用正则表达式

    1.匹配的不是一个字母

    ‘[^a-zA-Z]’

    2.匹配的单词要用没开头

    错误写法–》‘\bm\w*\b’ 因为转化为模式字符串不能直接用要转义

    正确写法—》‘\bm\w*\b’ 由于模式字符串可能需要大量的反斜杠和特殊字符 ,所以可以使用另一种写法 ----》r‘\bm\w*\b’

    在这里插入图片描述

    在这里插入图片描述

    二、使用re模块实现正则表达式操作

    2.1 匹配字符串

    1.使用match()方法进行匹配

    语法

    re.match(pattern,string,[flags])
    
    • 1

    从字符串的开始出进行匹配,成功返回Match对象,否则返回None

    1. pattern:表示模式字符串,由正则表达式转化而来
    2. string:要匹配的字符串
    3. flags:可选参数,表示标志位,用于控制匹配方法,比如是否区分大小写

    常用flags

    标志说明
    A或ASCAII对于\w、\W、\b、\B、\D、\s、\S只进行ASCAII匹配
    I或IGNORECASE执行不区分大小写
    M或MULTILINE将^和$用于包括整个字符串的开始和结束的每一行(默认情况下,适用于整个字符串的开始和结束处)
    S或DOTALL使用“.”字符匹配所有字符,包括换行符
    X或VARBOSE忽略模式字符串中未转移的空格和注释
    import re
    if __name__ == '__main__':
        pattern=r'mr_\w+'
        string1='mr_123'
        string2='123_mr_'
        string3='MR_123'
        match=re.match(pattern,string1)
        print(match)
        match = re.match(pattern, string2)
        print(match)
        match = re.match(pattern, string3)
        print(match)
        match = re.match(pattern, string3,re.I)
        print(match)
    
    》》》
    <re.Match object; span=(0, 6), match='mr_123'>
    None
    None
    <re.Match object; span=(0, 6), match='MR_123'>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    import re
    
    if __name__ == '__main__':
        pattern = r'mr_\w+'
        string1 = 'mr_123mr_123'
    
        match = re.match(pattern, string1)
        print(match)
        print('匹配的开始位置:', match.start())
        print('匹配的结束位置:', match.end())
        print('匹配位置的元组:', match.span())
        print('要匹配的字符串:', match.string)
        print('匹配的数据:', match.group())
    》》》
    <re.Match object; span=(0, 12), match='mr_123mr_123'>
    匹配的开始位置: 0
    匹配的结束位置: 12
    匹配位置的元组: (0, 12)
    要匹配的字符串: mr_123mr_123
    匹配的数据: mr_123mr_123
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.使用search()方法进行匹配语法

    re.search(pattern,string,[flags])
    
    • 1

    从字符串的开始出进行匹配,成功返回Match对象,否则返回None

    1. pattern:表示模式字符串,由正则表达式转化而来
    2. string:要匹配的字符串
    3. flags:可选参数,表示标志位,用于控制匹配方法,比如是否区分大小写
    import re
    if __name__ == '__main__':
        pattern=r'mr_\w+'
        string1='mr_123'
        string2='123_mr_'
        string3='MR_123'
        match=re.search(pattern,string1)
        print(match)
        match = re.search(pattern, string2)
        print(match)
        match = re.search(pattern, string3)
        print(match)
        match = re.search(pattern, string3,re.I)
        print(match)
    》》》
    <re.Match object; span=(0, 6), match='mr_123'>
    None
    None
    <re.Match object; span=(0, 6), match='MR_123'>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.使用findall()方法进行匹配语法

    re.findall(pattern,string,[flags])
    
    • 1

    从字符串的开始出进行匹配,成功返回Match对象,否则返回None

    1. pattern:表示模式字符串,由正则表达式转化而来
    2. string:要匹配的字符串
    3. flags:可选参数,表示标志位,用于控制匹配方法,比如是否区分大小写
    import re
    
    if __name__ == '__main__':
        pattern = r'mr_\w+'
        string1 = 'mr_123 mr_123'
    
        match = re.findall(pattern, string1)
        print(match)
        for item in match:
            print(item)
    
    
    
    》》》
    ['mr_123', 'mr_123']
    mr_123
    mr_123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.2 替换字符串

    re.sub(pattern,repl,string,count,[flags])
    
    • 1
    1. pattern:表示模式匹配字符串,由正则表达式转化而来
    2. repl:表示替换的字符串
    3. string:表示查找替换的原始字符串
    4. count:可选参数,表示替换的最大次数,默认所有即为0
    5. flags:可选参数,表示为标志,用于控制方法,比如区分大小写
    import re
    
    if __name__ == '__main__':
        pattern = r'mr_\w+'
        string1 = 'mR_123 mr_123'
        match = re.sub(pattern,'XXXXXX',string1)
        print(match)
    》》》
    mR_123 XXXXXX
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.3 使用正则表达式分割字符串

    re.split(pattern,string,[maxsplit],[flags])
    
    • 1
    1. pattern:表示模式匹配字符串,由正则表达式转化而来
    2. string:表示查找替换的原始字符串
    3. maxsplit:可选参数,表示最大的拆分次数
    4. flags:可选参数,表示为标志,用于控制方法,比如区分大小写
    import re
    
    if __name__ == '__main__':
        pattern = r'[?|&]'
        string1 = 'https://blog.csdn.net/huiguo_?spm=1010.2135.3001.5343'
        match=re.split(pattern,string1)
        print(match)
        print('--------------------------------')
        for item in match:
            print(item)
    
     》》》
     ['https://blog.csdn.net/huiguo_', 'spm=1010.2135.3001.5343']
    --------------------------------
    https://blog.csdn.net/huiguo_
    spm=1010.2135.3001.5343
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    nodejs安装及环境配置详细教程
    探店通系统源码,短视频矩阵源码,抖音矩阵系统源码。
    @软考考生,这份软考高分攻略你须知道
    js ArrayBuffer
    1-(2-甲氧基乙基)-3-乙基咪唑三氟甲基磺酸盐{[C22O1IM][TfO]}离子液体
    【Java中23种面试常考的设计模式之装饰器模式(Decorator)---结构型模式】
    NFS高可用方案:NFS+keepalived+Sersync
    Rust 进阶学习
    最长递增子序列 -- 动规
    Spring 框架中用到的设计模式。常见设计模式总结以及其作用简要说明
  • 原文地址:https://blog.csdn.net/huiguo_/article/details/125548910