• day18常用模块之re模块


    简单认识正则表达式

    正则测试工具:http://tool.chinaz.com/regex/

    元字符,单个字符匹配
    
        .         匹配除换行符以外的任意字符
        w         匹配字母数字下划线(word)
        s        匹配任意空白符    (space)
        d        匹配数字        (digit)
        
        大写则为非
        W      非字母数字下划线            [Ww] [Ss] [Dd] 可匹配全局
        S      非空白
        D      非数字
    
        
            匹配换行符
        	         匹配制表符
    
                匹配结尾        hello
    
        ^        匹配开头
        $        匹配结尾
    
        a|b          a或者b
        [^..]     除去哪些不匹配
    
    量词的使用
        
        *         匹配0次或多次
        +         匹配1次或多次 
        ?        匹配0次或1次
        {n}        匹配n次
        {n,}    匹配n次或更多次
        {n,m}    匹配n到m次
        在量词后面加?为惰性匹配
    
    分组:
        ()         需要将几个约束集中在一起约束

    re模块常用方法

    import re
    # findall
    # search
    # match
    
    ret = re.findall('[a-d]','hello world')     # 前面放匹配规则,后面放匹配字符串
    print(ret)
    
    ret = re.search('a','abc bca')              # 只匹配到第一个后就返回,调用group()方法得到结果。
    if ret: print(ret.group())                           # 匹配不到返回None,调用group() 会报错
    
    ret = re.match('ev','eva egon yuan')
    if ret: print(ret.group())                   # 只从整串字符串开头匹配,中间的匹配不到。同样需要group()方法
    
    # split
    
    ret = re.split('[ab]','abcd')               # 先按a分割,再按b分割 ['','bcd'] 
    print(ret)

    ['', '', 'cd'] # sub ret
    = re.sub('d','H','ads4vdef3vve2',1) # 将数字替换成 H,1 表示 只替换1处 print(ret)
    ret
    = re.subn('d','H','ads4vdef3vve2') # 将数字替换成 H,返回元祖以及替换次数 print(ret) # compile obj = re.compile('d{3}') # 将正则表达式编译成一个 正则表达式对象。 ret = obj.search('abc123eee') print(ret.group()) # finditer ret = re.finditer('d','sa2dv3vf4btf5bg678')  # finditer() 返回一个迭代器,同样需要用group()方法 print(ret) # <callable_iterator object at 0x000001BABCB10208>   for i in ret: print(i.group())

     python中需要注意的两个特殊优先级情况

    1.findall() 优先级

    import re
    
    ret = re.findall('www.(baidu|oldboy).com','www.baidu.com')
    print(ret)
    # ['baidu']  findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消分组优先

    ret = re.findall('www.(?:baidu|oldboy).com','www.baidu.com') print(ret) # ['www.baidu.com']

    2.split() 优先级

    import re
    
    ret = re.split('d','eva3acdf4scfg')
    print(ret)
    # ['eva', 'acdf', 'scfg']
    ret = re.split('(d)','eva3acdf4scfg') print(ret)
    # ['?:eva', '3', 'acdf', '4', 'scfg']
    #在匹配部分加上()之后所切出的结果是不同的,
    #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
    #这个在某些需要保留匹配部分的使用过程是非常重要的。

     计算器作业

    a = 1 - 2 * (( 60 - 30 + (-40/5) * (9 - 2*5/3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568/14)) - (-4*3) / (16-3*2))
    print(a)

     综合联系与扩展

    1.匹配标签

    import re
    ret
    = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>") #还可以在分组中利用?<name>的形式给分组起名字 #获取的匹配结果可以直接用group('名字')拿到对应的值 print(ret.group('tag_name')) #结果 :h1 print(ret.group()) #结果 :<h1>hello</h1> ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>") #如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致 #获取的匹配结果可以直接用group(序号)拿到对应的值 print(ret.group(1)) print(ret.group()) #结果 :<h1>hello</h1>

    2.匹配整数

    import re
    
    ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))")
    print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
    ret=re.findall(r"-?d+.d*|(-?d+)","1-2*(60+(-40.35/5)-(-4*3))")
    print(ret) #['1', '-2', '60', '', '5', '-4', '3']
    ret.remove("")
    print(ret) #['1', '-2', '60', '5', '-4', '3']
  • 相关阅读:
    Linux 下复制命令行输出内容或直接复制文本内容
    JavaScript Array contrast
    Docker安装 Mysql 8.0 并挂载外部配置和数据
    IPC 方法分类
    Linux 安装各种常用通讯软件
    Docker--关于域名和端口配置问题总结
    Golang--Directional Channel(定向通道)
    数位dp
    STL:reverse函数、upper_bound函数、lower_bound函数
    vue filter中无法访问this的解决方案
  • 原文地址:https://www.cnblogs.com/jiuyachun/p/10531830.html
Copyright © 2020-2023  润新知