zoukankan      html  css  js  c++  java
  • 从零开始的Python学习Episode 15——正则表达式

    正则表达式

    正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现,所以使用时要导入re模块。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

    先说几个元字符  . ^ $ * + ? { }

    import re
    
    ret = re.findall('t...r', 'hellotomorrow')
    print(ret)  # ['tomor']
    
    ret = re.findall('^r.w', 'r1whellotomorr2w')
    print(ret)  # ['r1w']
    
    ret = re.findall('r.w$', 'r1whellotomorr2w')
    print(ret)  # ['r2w']
    
    ret = re.findall('abc*', 'abcccc')  # 贪婪匹配[0,+oo]
    print(ret)  # ['abcccc']
    ret = re.findall('abc*', 'ab')  # 贪婪匹配[0,+oo]
    print(ret)  # ['ab']
    
    ret = re.findall('abc+', 'abccc')  # [1,+oo]
    print(ret)  # ['abccc']
    
    ret = re.findall('abc?', 'abccc')  # [0,1]
    print(ret)  # ['abc']
    
    ret = re.findall('abc{1,4}', 'abccc')
    print(ret)  # ['abccc'] 贪婪匹配
    
    ret=re.findall('abc*?','abcccccc')
    print(ret)#['ab'] 当* + ?的后面再加上?的话就会变成惰性匹配

     

    元字符:[ ]

    import re
    ret = re.findall('a[bc]d','abd')
    print(ret)#['abd'],选b或c
    
    ret = re.findall('[a-z]','abd')
    print(ret)#['a', 'b', 'd'],选出a到z的元素
    
    ret = re.findall('[.*+]','a.b+c*')
    print(ret)#['.', '+', '*'],消除某些元字符的特殊功能
    
    ret = re.findall('[1-9]','adc51ca')
    print(ret)#['5', '1'],选出1到9之间的数字
    
    ret = re.findall('[^ab]','jnan21b')
    print(ret)#['j', 'n', 'n', '2', '1'],选出除了a,b的元素
    
    ret = re.findall('dc','123 cad#4')
    print(ret)#['1', '2', '3', '4'],选出数字

     

    元字符的转义符

    反斜杠后边跟元字符去除特殊功能,比如.
    反斜杠后边跟普通字符实现特殊功能,比如d

    d  匹配任何十进制数;它相当于类 [0-9]。
    D 匹配任何非数字字符;它相当于类 [^0-9]。
    s  匹配任何空白字符;它相当于类 [ fv]。
    S 匹配任何非空白字符;它相当于类 [^ fv]。
    w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
    W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
      匹配一个特殊字符边界,比如空格 ,&,#等

    有一种特殊情况:

    import re
    m = re.findall('blow', 'blow')
    print(m)#[]
    m = re.findall('\bblow', 'blow')
    print(m)#['blow']
    m = re.findall(r'blow', 'blow')
    print(m)#['blow']

    这是因为在python解释器中“\”才相当于一个“”,而光写一个“”是不能被识别的。

    元字符( )分组

    ret = re.search('(?P<id>d{3})/(?P<name>w{2,3})', '233/cn')
    print(ret.group())#233/cn
    print(ret.group('id'))#233

    这段代码的意思是以‘/’为界限分为名为id(3个数字)和名为name(2个或3个字母)的两个组,其中(?P<XXX>)是固定的格式,但可以不用这种格式。如果没有用这种格式则没有办法按名字来访问组中的数据,按需求来选择是否要用。而search()是扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配。

    re.compile()

    compile()可以编译正则表达式模式,返回一个对象。可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率。

    import re
    
    ret = re.compile('(d{3})/(w{2,3})')
    print(ret.search('233/cn').group())
    #233/cn

    re.match()

    只检测是不是在string的开始位置匹配,若在开头检测不到,则返回空。

    ret = re.match('233','2334567')
    print(ret)
    #<re.Match object; span=(0, 3), match='233'>
    #可以通过ret.span()查看其终止点,通过ret.group()查看匹配到的内容。

    re.search()

    扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配.

    import re
    
    ret = re.compile('(d{3})/(w{2,3})')
    print(ret.search('233/cn').group())
    #233/cn,也可以像match那样用span和group

    re.split()

    原型是re.split(pattern, string, maxsplit=0)

    通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。

    import re
    
    ret = re.split('s','adsnjfsnja')
    print(ret)
    #['ad', 'njf', 'nja']

    re.sub()

    替换目标字符串中的部分内容,格式为sub('要匹配的类型','替换的内容','目标字符串','替换次数')

    import re
    
    ret = re.sub('d','abc','1bd,2fg')
    print(ret)#abcbd,abcfg
    ret = re.sub('d','abc','1bd,2fg',1)
    print(ret)#abcbd,2fg

    re.finditer()

    把匹配到的内容放到一个迭代器中,返回一个迭代器对象。

    import re
    
    ret = re.finditer('d','a1b2c3,4')
    print(ret)#<callable_iterator object at 0x0000021C112E8240>
    print(next(ret).group())#1
  • 相关阅读:
    td中内容自动换行
    PHP计算两个时间的年数、月数以及天数
    phpexcel常用操作
    php实现将人民币金额转大写的办法
    解决 PHPExcel 长数字串显示为科学计数
    phpexcel单元格内换行
    phpexcel设置所有单元格的默认对齐方式
    {dede:sql}标签的用法
    PHP 文件上传
    Dedecms 数据库结构分析
  • 原文地址:https://www.cnblogs.com/smilepup-hhr/p/9884500.html
Copyright © 2011-2022 走看看