zoukankan      html  css  js  c++  java
  • re模块

    # encoding:utf8
    import re
    
    # findall方法,查找全部匹配到的结果
    s = 'abcabbca3c'
    print(re.findall('ab', s))  # 结果为:['ab', 'ab']
    
    # . 单个字符
    s = 'abcabbca3c'
    print(re.findall('a.c', s))  # 结果为:['abc', 'a3c']
    
    # ?前面一个字符匹配0或1次
    s = '2acbabcabbacc'
    print(re.findall('ab?', s))  # 结果为:['a', 'ab', 'ab', 'a']
    
    # + 前面一个字符匹配1~+∞次
    s = '2acbabcabbacc'
    print(re.findall('ab+', s))  # 结果为:['ab', 'abb']
    
    # * 前面一个字符匹配0~+∞次
    s = '2acbabcabbacc'
    print(re.findall('ab*', s))  # 结果为:['a', 'ab', 'abb', 'a']
    
    # ^ 以^后面的字符串开头,精准匹配
    s = 'acbabcacbbacc'
    print(re.findall('^acb', s))  # 结果为:['acb']
    print(re.findall('^abc', s))  # 结果为:[]
    
    # $ 以$前面的字符串开头,精准匹配
    s = 'acbabcacbbacc'
    print(re.findall('acc$', s))  # 结果为:['acc']
    print(re.findall('abc$', s))  # 结果为:[]
    
    # {} 指定匹配次数。{3}前面的字符匹配3次;{1,}同+,前面的字符匹配1~+∞次;{1,3}前面的字符匹配1-3次
    s = '2aabcabbacabbbc'
    print(re.findall('ab{2}', s))  # 结果为:['abb', 'abb']
    print(re.findall('ab{1,}', s))  # 结果为:['ab', 'abb', 'abbb']
    print(re.findall('ab{2,3}', s))  # 结果为:['abb', 'abbb']
    
    # () 吧()内的字符串作为整体。优先完全匹配;可通过?:来全部匹配
    s = '2aabcabbacabbbc'
    print(re.findall('(ab)*', s))  # 匹配0到多次,结果为:['', '', 'ab', '', 'ab', '', '', '', 'ab', '', '', '', '']
    print(re.findall('(ab)+', s))  # 匹配1到多次,结果为:['ab', 'ab', 'ab']
    s = 'abcababcababab'
    print(re.findall('(ab)', s))  # 整体匹配,结果为:['ab', 'ab', 'ab', 'ab', 'ab', 'ab']
    print(re.findall('(?:ab)+', s))  # 整体全部匹配,结果为:['ab', 'abab', 'ababab']
    print(re.findall('(?:ab)+', 'abababab'))  # 整体全部匹配, 结果为:['abababab']
    print(re.findall('(ab)+', 'abababab'))  # 整体完全匹配,结果为:['ab']
    
    # | 吧|左右的字符串作为整体匹配,若匹配成功左侧,则不再匹配右侧
    s = 'abcdacd'
    print(re.findall('abc|cd', s))  # 优先匹配左侧,结果为['abc', 'cd']
    print(re.findall('ab|cd', s))  # 结果为['ab', 'cd']
    print(re.findall('abc|abcd', 'abcdabc'))  # 优先匹配左侧,结果是['abc','abc']
    
    # [] 吧[]内的字符集单独匹配,[]内的字符均当做普通字符处理;^表示不含
    s = 'abcdabdacdbad'
    print(re.findall('a[bc]d', s))  # 结果是['abd', 'acd']
    print(re.findall('a[b*]d', 'abcabdacca*da'))  # 结果是['abd', 'a*d']
    
    # 在[]内写^表示不包含字符
    print(re.findall('a[^cb]d', 'aedacdahdabdasd'))  # 结果是['aed', 'ahd', 'asd']
    print(re.findall('a[^a-z]c', 'asa2a3c4c'))  # 结果是['a3c']
    print(re.findall('([^()]+)', '1+7-(3*(6-2)-4)'))  # 提取最里面的括号和内容,结果是['(6-2)']
    
    # 查找特殊字符例如*+().等,需要转义,使用或者r'待查找字符串'
    print(re.findall('www.baidu', 'www.163www.baidu.comwwwabaidu'))  # 结果是['www.baidu', 'wwwabaidu'],会默认.为一个字符
    print(re.findall('www.baidu', 'www.163www.baidu.com'))  # 结果是['www.baidu']
    print(re.findall(r'www.baidu', 'www.163www.baidu.com'))  # 结果是['www.baidu']
    
    # 在[]内写范围,比如0-9,比如a-z
    print(re.findall('a[1-3]c', 'abca1caesa3cas'))  # 结果是['a1c', 'a3c']
    print(re.findall('a[1-3a-zA-Z]c', 'abca1caDsascaFc'))  # 结果是['abc', 'a1c', 'asc', 'aFc']
    
    # 特殊字符 d 表示[0-9],D表示除去前面的范围剩下的
    print(re.findall('d', 'ab123c.d32a+"3452d'))  # 结果是['1', '2', '3', '3', '2', '3', '4', '5', '2']
    print(re.findall('d+', 'ab123c.d32a+"3452d'))  # 结果是['123', '32', '3452']
    print(re.findall('D', 'ab123c.d32a+"3452d'))  # 结果是['a', 'b', 'c', '.', 'd', 'a', '+', '"', 'd']
    print(re.findall('D+', 'ab123c.d32a+"3452d'))  # 结果是['ab', 'c.d', 'a+"', 'd']
    
    # 特殊字符 w表示[0-9a-zA-Z_]以及中文,W表示除去前面范围剩下的
    print(re.findall('w+', 'ab12我3_c.d3是2a+"34_52d'))  # 结果是['ab12我3_c', 'd3是2a', '34_52d']
    print(re.findall('W+', 'ab12我3_c.d3是2a+"34_52d'))  # 结果是['.', '+"']

     ----------add 20190828------------

    最近开始研究爬虫,然后发现bs4的解析模块不是很好用,就想更深入的使用re来获取页面信息:

    1 import re
    2 
    3 s = """<li><span>2014-04-09</span><a href="http://book.txtbook.com.cn/shu/2995/397892/" class="nocur" target="_blank">第三百零三章 我跟老天打个招呼</a></li>"""
    4 print(s)
    5 print('==================')
    6 p_http = re.compile(r'<li><span[^.]*?href="(.*?)" class[^.]*?_blank">(.*?)</a>',re.S)
    7 rs = re.findall(p_http,s)
    8 for i in rs:print(i)

    代码如上,结果是:

    1 <li><span>2014-04-09</span><a href="http://book.txtbook.com.cn/shu/2995/397892/" class="nocur" target="_blank">第三百零三章 我跟老天打个招呼</a></li>
    2 ==================
    3 ('http://book.txtbook.com.cn/shu/2995/397892/', '第三百零三章 我跟老天打个招呼')

    解释一下:

    re.findall(匹配模式,匹配对象) 

    这里预设了一个模式使用的是re.compile

    <li><span 代表的是以这段字符串开头

    [^.]*? 代表的是中间可以有任意个字符,这里的.替代任意字符 *? 一次或多次

    href=" 代表的是以这段字符串结尾

    (.*?) 代表的是中间的任意个字符

    " class 代表的是要以这段字符串结尾

    [^.]*?_blank"> 代表的是中间任意个字符但是以_blank">结尾

    因为re匹配是逐行来进行匹配的,如果需要获取的内容(.*?)的前后内容不在同一行则无法找到需要获取的内容。

    看下示例:

    1 import re
    2 s = """asdasdhifirtom
    3 asdashisec
    4 asdtomsdhiadsto
    5 msasdhithistom"""
    6 print(re.findall('hi(.*?)tom',s))  # 结果:['fir', 'this']
    7 print(re.findall('hi(.*?)tom',s,re.S))  # 结果:['fir', 'sec
    asd', 'adsto
    msasdhithis']

    如果不使用re.S的话就不会跨行匹配(但是需要注意的是换行符也会被识别出来,如果需要匹配的字符串的一部分在行尾,一部分在行首是无法匹配到的!)

    参考博客:

    python html抓取,并用re正则表达式解析(一):https://blog.csdn.net/wukong_666/article/details/84146738

    【Python】re模块中re.match和re.search用法总结:https://www.cnblogs.com/papapython/p/7482349.html

    正则表达式re.S的用法:https://www.cnblogs.com/moning/p/8296893.html

    在此,感谢各位博主无私的分享。

  • 相关阅读:
    .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7.2)系列一:Docker入门
    在ASP.Net Core 中使用枚举类而不是枚举
    ASP.Net Core 中使用Zookeeper搭建分布式环境中的配置中心系列一:使用Zookeeper.Net组件演示基本的操作
    Redis系列文章总结:ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁
    从源码中学习设计模式系列——单例模式序/反序列化以及反射攻击的问题(二)
    ASP.NET Core依赖注入——依赖注入最佳实践
    2019年第一天——使用Visual Studio 2019 Preview创建第一个ASP.Net Core3.0的App
    ASP.Net Core2.1中的HttpClientFactory系列二:集成Polly处理瞬态故障
    ASP.Net Core2.1中的HttpClientFactory系列一:HttpClient的缺陷
    Docker for .Net Developers(part1:Docker基本概念介绍)
  • 原文地址:https://www.cnblogs.com/wjlv/p/11011088.html
Copyright © 2011-2022 走看看