• python中正则匹配之re模块


    Python中正则表达式

    re:re是提供正则表达式匹配操作的模块

    一、什么是正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起增加了re模块,它提供Perl风格的正则表达式。

    二、正则表达式的基本使用

    1、re.match()介绍
    match() 试图从字符串的起始位置对模式进行匹配,如果匹配成功,就返回一个匹配对象,如果匹配失败,就返回None,匹配对象的group()方法能显示成功匹配的对象。

    使用语法:

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

    参数说明

    • 匹配的正则表达式,直接传入一个字符串,Python会将字符串作为正则表达式来对待
    • 匹配的字符串
    • 标志位:用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等
    import re
    ret = re.match("hello","hello word")
    print(ret.group())  # 使用group()方式返回对应的分组
    
    注意:
    • match() 匹配是从字符串的开始位置匹配,如果开始匹配不到则不在匹配并返回一个None
    import re
    ret = re.match("hello","ahello word")
    print(ret.group())  # 匹配不成功,就返回None
    

    2、re.search()介绍

    • re.match() 是从字符串的开始位置匹配,所以基本情况下能够匹配的概率不大。
    • re.search() 是从字符串中搜索正则表达式模式,任何位置都可以被匹配,返回的是第一次出现的匹配对象(因为正则字符串中可能会多出匹配),它的参数和re.match()是一样的,返回值也是一个匹配对象

    使用语法:

    re.search(pattern,string[,flags])  
    
    import re
    ret = re.search("hello","ahello word")  # 搜索成功
    print(ret.group())  # hello
    

    3、re.match()和re.search()的区别

    • re.match匹配的时候只匹配字符串的开始,如果字符串的开始不符合正则表达式,则匹配失败,函数返回None。
    • re.search() 匹配整个字符串,直到匹配到一个。
    import re
    ret = re.search("^hello","ahello word")  # 如果在hello前面加^号,其search的功能和match的功能一样
    print(ret.group())  # 匹配不成功,返回None
    

    4、re.fildall()介绍

    • re.fildall() 对整个字符串从左到右进行匹配,返回所有匹配对象的列表.

    使用语法:

    re.fildall(pattern,string[,flags])
    
    ret = re.fildall('d+','hello123,word456')
    print(ret)
    结果:
    >>>['123','456']
    

    5、re.compile()介绍

    • re.compile() 对整个正则表达式进行预编译,生成表达式对象,用于正则匹配

    使用语法:
    re.compile(pattern,flags)

    import re
    rule = re.compile('d+')
    ret = rule.findall('hellow word456')
    print(ret)
    >>>456
    

    6、re.split()介绍

    • re.split()方法与字符串的切割方法一样,返回的是一个列表,这了我用正则匹配进行切割

    使用语法:
    re.split(pattern,string,maxsplit,flags)

    import re
    strs = 'zhangsan123wangwu345we'
    set = re.split('d+',strs)
    print(set)
    >>>['zhangsan', 'wangwu', 'we']
    

    7、re.sub()介绍

    • re.sub() 批量替换字符串中某个字符,如:将'hello word'替换成'HELLO word'

    使用语法:
    re.sub(pattern,repl,string,count)

    import re
    strs = 'hello word'
    ret = re.sub('hello','HELLO',strs)
    print(ret)
    >>>HELLO word
    # 使用正则来匹配替换
    strs = 'abcd123efg345hi'
    ret = re.sub(r'd+','HELLO',strs)
    print(ret)
    >>>abcdHELLOefgHELLOhi
    

    8、re.subn()介绍

    • re.subn的用法和re.sub是一样的,区别在与返回值,re.sub返回的是字符串,而re.subn返回的是元组

    使用语法:
    re.subn(pattern,repl,string,count)

    import re
    strs = 'abcd123efg345hi'
    ret = re.subn(r'd+','HELLO',strs)
    print(ret)
    >>>('abcdHELLOefgHELLOhi', 2)   #('替换后的字符串',替换的次数)
    
    # 指定替换的次数
    import re
    strs = 'abcd123efg345hi'
    ret = re.subn(r'd+','HELLO',strs,1)
    print(ret)
    >>>('abcdHELLOefg345hi', 1)
    

    三、正则表达式语法

    • 正则表达式的强大之处是因为它提供了很多特殊符号和字符,使用它们正则表达式才可以强大而又灵活。
    字符组
    符号 描述
    [0-9] 匹配数字
    [a-z] 匹配小写字母
    A-Z 匹配大写字母
    [0-9A-z] 匹配数字及大小写字母
    [3-9] 匹配小范围的数字值
    [a-f] 匹配小范围的字母值
    [^abc] 不匹配abc任意字符
    [^a-z] 不匹配a-z直接的任意字符
    1[0-9] 匹配10-19直接的数值
    1[0-9][0-9] 匹配100-199直接的数值
    元字符
    符号 描述
    d 匹配固定:0-9数值
    w 匹配数字字母及下划线中文:[0-9A-z_"中文"]
    s 匹配空白符:空格,Tab,回车
    匹配Tab
    匹配回车
    D 匹配数字
    W 匹配非数字字母下划线
    S 匹配非空白符
    . 匹配除换行符外任意一个字符
    ^ 匹配以某字符开头
    $ 匹配以某字符结尾
    [] 字符组(只要在[]里面的都匹配)
    [^] 非字符组(只要在[]里面的都不匹配)
    | 或,(如:abcdef|acb)
    () 分组,如:^(abcdef|abc)$
    量词
    符号 描述
    {n} 重复n次
    {n,} 重复至少n次,n次以上
    {n,m} 重复n-m次
    ? 0或1次
    + 1到不限
    * 0到不限
    贪婪和惰性
    表达式 描述
    a.*b 贪婪
    a.*?b,a.+?b 惰性,在量词后面的?表示惰性匹配,会在符合条件的基础上尽量少的匹配其他内容

    贪婪匹配模式

    • 用到量词的匹配时,默认为贪婪模式
    • 贪婪模式的意思就是匹配的时候,尽量多匹配,不行再慢慢的减少匹配
    import re
    lst = "d{2,4}"
    ret = re.search(lst,"12345abcd")
    print(ret.group())
    结果:
    >>>1234
    

    惰性匹配模式

    • 惰性匹配模式正好和贪婪模式相对
    • 惰性匹配是尽量少的匹配,不行再慢慢去增加匹配的个数
    • 惰性匹配只需要在量词后面添加?即可
    import re
    lst = "d{2,4}?"
    ret = re.search(lst,"12345abcd")
    print(ret.group())
    结果:
    >>>12
    
    常用正则表达式
    表达式 描述 结果
    1[3-9]d{9} 匹配手机号 13888998899
    [1-9]d* 匹配任意的正整数 143
    d+.d+ 匹配任意小数 12.345
    d+(.d+) 匹配整数或小数 12或者12.131231
    常用分组
    代码 描述
    (exp) 匹配exp,并捕获文本到自动命名的组里
    (?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写(?'name'exp)
    (?:exp) 匹配exp,不捕获匹配的文本,也不给次分组分配组号
    (?=exp) 匹配exp前面的位置
    (?<=exp) 匹配exp后面的位置
    (?!exp) 匹配后面跟的不是exp的位置
    (?<!exp) 匹配前面不是exp的位置
    findall,search和分组的关系

    案例1:

    import re
    ret = re.findall('d(d)','a1,b22,c345')
    print(ret)
    >>>[2,4]
    

    案例2:

    import re
    ret = re.findall('d(?:d)','a1,b22,c345')
    print(ret)
    >>>['22','34']
    

    案例3:

    import re
    ret = re.search('(?P<num1>d)(?P<num2>d)','a14,b22,c3357')
    print(ret.group())   # 14
    print(ret.group(0))  # 14
    print(ret.group(1))  # 1
    print(ret.group(2))  # 4
    print(ret.group('num1'))  # 1
    print(ret.group('num2'))  # 4
    

    案例4:

    import re
    ret = re.search('(?P<num1>d)(?P=num1)','a14,b22,c3357')
    print(ret.group())  #匹配10位数,并且分组1=分组2
    >>>22
    
    分组的作用
    import re
    ret = re.search("<(?P<tag_name)>w)>.*</(?P=tag_name)>","<h1>hello<h1>")
    print(ret)
    print(ret.group('tag_name'))
    print(ret.group())
    >>>h1
    >>>h1
    >>><h1>hello</h1>
    
  • 相关阅读:
    Shiro权限验证
    5种设计模式整理
    多模块的SpringBoot项目
    Go使用数据库
    使用Go mod
    docker基本使用
    Go的IO操作
    实现一个网盘存储……
    Go的网络编程
    学习golang的历程
  • 原文地址:https://www.cnblogs.com/Anesthesia-is/p/11503398.html
Copyright © 2020-2023  润新知