• Python之字符串正则匹配


    需求:

    正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配(因为是贪婪匹配 )。 而你想修改它变成查找最短的可能匹配。
    import re
    text2 = 'Computer says "no." Phone says "yes."'
    str_pat=re.compile(r'"(.*)"')   # 匹配引号包裹的任意文本,并编译
    print(str_pat.findall(text2))   #['no." Phone says "yes.'],并不是我们想要的['no.', 'yes.'],由于正则表达式* 匹配0到人一多次,是贪婪匹配
    # 解决方式
    new_str_pat=re.compile(r'"(.*?)"')
    print(new_str_pat.findall(text2))  # ['no.', 'yes.']
    多行匹配模式
    comment = re.compile(r'/*(.*?)*/')
    text1 = '/* this is a comment */'
    text2 = '''/* this is a
    multiline comment */
    '''
    print(comment.findall(text1))  # [' this is a comment ']
    # [' this is a comment ']
    print(comment.findall(text2))  # []
    
    new_comment=re.compile(r'/*((?:.|
    )*?)*/')   # (?:)    指定非捕获组 不捕获匹配的文本,也不给此组分配组号。
    print(new_comment.findall(text2))  # [' this is a
    multiline comment ']  定义了一个仅仅用来做匹配,而不能通过单独捕获或者编号的组)。

    补充:捕获组和非捕获组

    捕获组
    什么是捕获呢?使用小括号指定一个子表达式后,匹配这个子表达式的文本(即匹配的内容)可以在表达式或者其他过程中接着用,
    怎么用呢?至少应该有个指针啥的引用它吧? 对!默认情况下,每个分组(小括号)会自动拥有一个组号,从左到右,以分组的左括号为标志,第一个出现的分组组号为1,后续递增。如果出现嵌套,
    (d+)/(d+)/(d+) 
    # group1 group2 group3 取捕获组的值
    (?:)(?=)(?<=)非捕获组
    非捕获组举例子:
    # (?:)非捕获组
    a = "6000¥ 和 1000$"
    # 需求是得到金额和货币种类
    # 捕获组
    print(re.findall(r"(d+)+([$¥])",a))  # [('6000', '¥'), ('1000', '$')]
    
    a = "10010.86¥"
    # 需求是得到金额和货币种类,提炼出 10010 和 ¥
    # (?:)非捕获组(),可以理解为只分组而不捕获
    print(re.findall(r"(d+)(?:.?)(?:d+)([¥$])$",a))  # [('10010', '¥')
    
    # 非捕获 (?=)和(?<=) 前后查找,有的资料把它们叫做肯定式向前查找和肯定式向后查找;
    b="12332aa438aaf"
    
    print(re.findall(r"[0-9a-z]{2}(?=aa)",b))  #['32', '38'] 该正则的意思是 匹配这么一个字符串,它要满足:是两位字符(数字,或字母),且后面紧跟着两个a
    # 分析:44aa 这个子串满足这个条件,所以可以匹配到,又因为 (?=) 的部分是不捕获的,所以输出的只是 44,不包括aa,后面的同理
    # 再深入看一下:
    # 当str第一次匹配成功输出 32 后,程序要继续向后查找是否还有匹配的其它子串。那么这时应该从 32aa 的后一位开始向后查找,还是从 32 的后一位呢?
    # 也就是从索引 5 开始还是从 7 开始呢?有人可能想到是从 32aa 的下一位开始往后找,
    # 因为 32aa 匹配了正则,所以下一位当然是它的后面也就是从 4 开始。但实际上是从 32 的后一位也就是第一个 a 开始往后找。原因还是 (?=) 是非捕获的
    
    # 下面说一下 (?<=) 向前匹配
    print(re.findall(r"(?<=aa)[0-9a-z]{2}",b))  # ['43']
     
  • 相关阅读:
    网页解析Jsoup简单使用
    ios开发中加载的image无法显示
    数据懒加载
    ijkplayer
    ijkplayer的一些优化
    Ambiguous expansion of macro weakify和Ambiguous expansion of macro strongify的警告
    xcode11新项目删除main.storyboard 两种方法
    iOS
    iOS
    iOS 12中获取WiFi的SSID
  • 原文地址:https://www.cnblogs.com/zzy-9318/p/10457951.html
Copyright © 2020-2023  润新知