• 14python模块之re


    1、re模块的基础方法

      1.1查找

        findall:返回列表 找到所有的匹配项

        search:匹配成功就返回一个变量,通过group取匹配到的第一个值,不匹配就返回None,group报错

    1 ret2 = re.search('d+','asd123sdf43asd23')
    2 print(ret2)  # 打印的是内存地址,这是一个正则匹配的结果
    3 print(ret2.group())  #通过ret.group()来获取真正的结果

        match:相当鱼search的正则表达式中加了一个'^',其余没有区别

      1.2切割和替换

        split:返回列表,按照正则规则去切割,默认匹配到的内容会被切割

    1 s = 'john23faker27chuang50'
    2 ret3 = re.split('d+',s)
    3 print(ret3)
    4 
    5 #打印结果为:['john', 'faker', 'chuang', '']

        sub/subn:替换,按照正则规则去寻找要被替换掉的内容,subn返回元祖,第二个值是替换的次数

    # sub替换 (正则,替换的结果,需要替换的内容,替换的次数)
    ret4 = re.sub('d+', 'H', 'john23faker27chuang50', 1)
    print(ret4)
    
    打印结果为:johnHfaker27chuang50

      1.3编译和迭代器

        compile:编译一个正则表达式,用这个结果去search math findall finditer 能够节省时间

        finditer:返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存

    2、关于分组在re模块中的使用

      2.1关于分组优先在findall中的用法:---(w+)

    1 #python正则默认分组优先:(这个和正则本身无关)
    2 s = '<a>wahaha</a>'
    3 ret = re.findall('>(w+)<',s)
    4 print(ret)   # 预期:>wahaha<   实际:wahaha  就是分组优先
    5 ret2 = re.findall('>(?:w+)<',s)  #组内最前面加上?:表示取消分组优先
    6 print(ret2)   # 正常打印

      2.2关于分组优先在split中的用法:

    # split
    ret3 = re.split('d+','john23faker27chuang50')  # 切割的内容不会保留
    ret4 = re.split('(d+)','john23faker27chuang50')  # 切割的内容会保留
    print(ret3)
    print(ret4)

      2.3分组命名

    # 分组命名,使用前面的分组 要求使用这个名字的分组和掐面同名分组中的内容匹配的必须一致。(用python也可以直接实现)
    s = '<a>wahaha</a>'
    pattern = '<(?P<tab>w+)>(w+)</(?P=tab)>'
    ret = re.search(pattern, s)
    print(ret)

      上述代码,如果将a标签的结束标签改变一下,则会返回None。

      2.4.分组在re模块中的方法之search:

    1 import re
    2 s = '<a>wahaha</a>'
    3 ret = re.search('<(w+)>(w+)</(w+)>',s)
    4 print(ret.group())  # 所有的结果
    5 print(ret.group(1))
    6 print(ret.group(2))
    7 print(ret.group(3))

      这是最基础的通过.group(index)来取分组中的内容

      如果给分组起名字的话,也可以直接通过.group(name)来取分组中的内容( 正则(?P<name>正则)      使用这个分组 ?P=name)

    3、用正则写的一个简易爬虫demo

      纯正则提取,函数写。

      

     1 # coding:utf-8
     2 import re
     3 from urllib.request import urlopen
     4 
     5 
     6 def getPage(url):  # 获取整个html的字符串
     7     response = urlopen(url)
     8     return response.read().decode('utf-8')
     9 
    10 
    11 def parsePage(s):
    12     ret = com.finditer(s)  # 从这个html中,找到所有符合com正则表达式规则的内容并且以迭代器的形式返回
    13     for i in ret:
    14         yield {
    15             "id": i.group("id"),
    16             "title": i.group("title"),
    17             "rating_num": i.group("rating_num"),
    18             "comment_num": i.group("comment_num")
    19         }
    20 
    21 
    22 def main(num):
    23     url = 'https://movie.douban.com/top250?start=%s&filter=' %num
    24     response_html = getPage(url)
    25     ret = parsePage(response_html)
    26     print(ret)
    27     f = open("move_info7", "a", encoding="utf8")
    28 
    29     for obj in ret:
    30         print(obj)
    31         data = str(obj)
    32         f.write(data + "
    ")
    33 
    34 
    35 com = re.compile(
    36     '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>'
    37     '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
    38 
    39 count = 0
    40 for i in range(10):
    41     main(count)
    42     count += 25
  • 相关阅读:
    《TomCat与Java Web开发技术详解》(第二版) 第六章节的学习总结 ---- JSP技术
    《Lucene in Action 第二版》第三章节的学习总结----IndexSearcher以及Term和QueryParser
    《TomCat与Java Web开发技术详解》(第二版) 第六章节对应CD附带的helloapp无法启动的问题解决
    《TomCat与Java Web开发技术详解》(第二版) 第五章节的学习总结 ---- Servlet的高级用法
    《Lucene in Action》(第二版) 第二章节的学习总结 ---- IndexWriter+Document+Field
    《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索
    Windows Server 2008 R2 配置AD(Active Directory)域控制器
    Windows Server 2008 R2 负载平衡入门篇
    Asp.net MVC 的八个扩展点
    C# 使用memcache(memcache安装)
  • 原文地址:https://www.cnblogs.com/cbslock/p/11153506.html
Copyright © 2020-2023  润新知