zoukankan      html  css  js  c++  java
  • 正則補充

    多行匹配

    import re
    s = """http://www.baidu.com
    https://sina.com.cn
    https://youku.com
    haam
    abchttp://www.oldboy.com
    """
    # 想将url都匹配出来 => 分组
    # print(re.findall(r'(?:http://|https://).+(?:com|cn)', s))
    
    # ^代表以什么开头,$代表以什么结尾,必须结合flags=re.M来完成多行匹配
    print(re.findall(r'^http.+com$', s, re.M))

    分組匹配

    import re
    
    url = 'https://www.baidu.com, http://www.youku.com'
    # 需求:拿到url的域名的  baidu , youku
    print(re.findall(r'www.([a-z]+).com', url))  # ['baidu', 'youku']
    
    # ()代表分组
    # findall匹配,如果匹配规则用有分组语法,只存放分组结果
    print(re.findall(r'(www).([a-z]+).com', url))  # [('www', 'baidu'), ('www', 'youku')]
    
    # 分组的顺序编号按照左括号的前后顺序
    print(re.findall(r'(((w)ww).([a-z]+).com)', url))  # [('www.baidu.com', 'www', 'w', 'baidu'), ('www.youku.com', 'www', 'w', 'youku')]
    
    
    # findall是全文匹配,可以从任意位置开始,匹配多次
    # match非全文匹配,必须从头开始匹配,只能匹配一次
    
    # 专门处理分组的方法:分组,分组编号,有名分组,取消分组
    # 取消分组: 必须写(),但是()为分组语法,我们只是想通过()将一些数据作为整体,所以()必须,再取消分组即可
    # (?:) 取消分组只是作为整体   (?P<名字>) 有名分组
    url = 'www.baidu.com,www.youku.com'
    res = re.match(r'((?:www).(?P<name>[a-z]+).com)', url)
    # print(res)  # <_sre.SRE_Match object; span=(0, 13), match='www.baidu.com'>
    print(res.group(1))
    print(res.group(2))
    print(res.group('name'))

    正則拆分重組與替換

    import re
    
    s = 'a b ac def'
    print(s.split(' '))  # ['a', 'b', 'ac', 'def']
    
    # 正则拆分
    s = 'a b,ac@def'
    print(re.split(r'[ ,@]', s))  # ['a', 'b', 'ac', 'def']
    
    
    s = 'python abc python'
    print(re.sub('python', 'Python', s))  # Python abc Python
    print(re.sub('python', 'Python', s, count=1))  # Python abc python
    
    
    # 结合分组可以完成信息的重组与替换
    s = 'day a good!!!'  # 'a good good day'
    print(re.sub('(day) (a) (good)', r'today is 2 3 3 1', s))

    貪婪匹配和非貪婪匹配

    import re
    '''贪婪匹配: 尽可能多的匹配
    {n,}
    {,n}
    {n,m}
    *
    +
    ?
    '''
    '''非贪婪匹配:尽可能少的匹配
    {n,}?
    {,n}?
    {n,m}?
    *?
    +?
    ??
    '''
    print(re.findall(r'ab{0,}', 'aababbabbb'))  # ['a', 'ab', 'abb', 'abbb']
    print(re.findall(r'ab{0,}?', 'aababbabbb'))  # ['a', 'a', 'a', 'a']
    
    print(re.findall(r'ab{,3}', 'aababbabbb'))  # ['a', 'ab', 'abb', 'abbb']
    print(re.findall(r'ab{,3}?', 'aababbabbb'))  # ['a', 'a', 'a', 'a']
    
    print(re.findall(r'ab{1,3}', 'aababbabbb'))  # ['ab', 'abb', 'abbb']
    print(re.findall(r'ab{1,3}?', 'aababbabbb'))  # ['ab', 'ab', 'ab']
    
    print(re.findall(r'ab*', 'aababbabbb'))  # ['a', 'ab', 'abb', 'abbb']
    print(re.findall(r'ab*?', 'aababbabbb'))  # ['a', 'a', 'a', 'a']
    
    print(re.findall(r'ab+', 'aababbabbb'))  # ['ab', 'abb', 'abbb']
    print(re.findall(r'ab+?', 'aababbabbb'))  # ['ab', 'ab', 'ab']
    
    print(re.findall(r'ab?', 'aababbabbb'))  # ['a', 'ab', 'ab', 'ab']
    print(re.findall(r'ab??', 'aababbabbb'))  # ['a', 'a', 'a', 'a']
    
    
    print(re.findall(r'', ''))  # ['']
    print(re.findall(r'a{0}', 'a'))  # ['', '']
    
    # 非贪婪匹配结合单个匹配结果是没有任何意义的
    print(re.findall(r'b*?', 'bbbbbbbb'))
    print(re.findall(r'(?:ab)*?', 'bbbbbbbb'))
    
    # 非贪婪匹配的应用场景,正则一定会有首尾标识,中间匹配的结果会有非贪婪匹配的语法
    s = '<a>abc</a><a></a>'
    print(re.findall(r'<.*>', s))  # ['<a>abc</a><a></a>']
    print(re.findall(r'<.*?>', s))  # ['<a>', '</a>', '<a>', '</a>']
    
    print(re.findall(r'<a>(.*)</a>', s))  # ['abc</a><a>']
    print(re.findall(r'<a>(.*?)</a>', s))  # ['abc', '']
  • 相关阅读:
    Kinect 开发 —— 硬件设备解剖
    Kinect 开发 —— 引言
    (转)OpenCV 基本知识框架
    OpenCV —— 摄像机模型与标定
    OpenCV —— 跟踪与运动
    OpenCV —— 图像局部与分割(二)
    OpenCV —— 图像局部与部分分割(一)
    OpenCV —— 轮廓
    OpenCV —— 直方图与匹配
    OpenCV —— 图像变换
  • 原文地址:https://www.cnblogs.com/duGD/p/10871771.html
Copyright © 2011-2022 走看看