zoukankan      html  css  js  c++  java
  • 正则表达式强化,爬虫练习

    re模块下的常用方法

     

    复制代码
    import re
    ret = re.findall('d+(.d+)?', '1.23+2.34')      
    print(ret) 结果: ['.23','.34']
    # findall的正则表达式里面有分组(),()里面的内容优先显示
    ret = re.findall('d+(?:.d+)?', '1.23+2.34')
    print(ret)    结果: ['1.23','2.34']
    # ?:写在一个分组的最开始,表示在findall方法中取消这个分组的优先级
    ret = re.findall('a', 'eva egon yuan')   # 返回所有满足匹配条件的结果,放在列表里 
    print(ret) #结果 : ['a', 'a']

    ret
    = re.search('a', 'eva egon yuan').group()
    print(ret) #结果 : 'a' # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
    # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

    ret
    = re.match('a', 'abc').group() # 同search,不过是在字符串开始处进行匹配,默认加'^',没有返回None
    print(ret) #结果 : 'a'

    ret
    = re.split('[ab]', 'abcd')
    # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) # ['', '', 'cd']
    ret = re.split('d+','alex123wusir456')
    print(ret)    #['alex','wusir','']
    ret = re.split('(d+)','alex123wusir456')
    print(ret)    #['alex','123','wusir','456','']
    # split中如果带有分组(),会在分割的同时保留被分割内容中带分组的部分
    ret = re.sub('d', 'H', 'eva3egon4yuan4', 1) #将数字替换成'H',参数1表示只替换1个 
    print(ret) # evaHegon4yuan4
    ret
    = re.subn('d', 'H', 'eva3egon4yuan4') #将数字替换成'H',返回元组(替换的结果,替换了多少次)
    print(ret) #('evaHegonHyuanH',3)
    obj
    = re.compile('d{3}') # 将正则表达式编译成为一个正则表达式对象,规则要匹配的是3个数字 ret = obj.search('abc123eeee') # 正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) #结果 : 123 import re ret = re.finditer('d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) #查看第一个结果 ret.__next__ == next(ret) print(next(ret).group()) #查看第二个结果 print([i.group() for i in ret]) #查看剩余的左右结果 3 4 7 8 4
    复制代码

    综合练习与扩展

    1、匹配标签

    复制代码
    import re
    
    ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
    #还可以在分组中利用?P<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))  # 结果:h1
    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']
    复制代码

    3、数字匹配

    复制代码
    1、 匹配一段文本中的每行的邮箱
          http://blog.csdn.net/make164492212/article/details/51656638
    
    2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;
    
       分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
       一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
    
    3、 匹配qq号。(腾讯QQ号从10000开始)  [1,9][0,9]{4,}
    
    4、 匹配一个浮点数。       ^(-?d+)(.d+)?$   或者  -?d+.?d*
    
    5、 匹配汉字。             ^[u4e00-u9fa5]{0,}$ 
    
    6、 匹配出所有整数

    4、爬虫练习

    复制代码
    import re
    import json
    from urllib.request import urlopen
    
    def getPage(url):
        response = urlopen(url)
        return response.read().decode('utf-8')
    
    def parsePage(s):
        com = re.compile(
            '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>'
            '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
    
        ret = com.finditer(s)
        for i in ret:
            yield {
                "id": i.group("id"),
                "title": i.group("title"),
                "rating_num": i.group("rating_num"),
                "comment_num": i.group("comment_num"),
            }
    
    
    def main(num):
        url = 'https://movie.douban.com/top250?start=%s&filter=' % num
        response_html = getPage(url)
        ret = parsePage(response_html)
        print(ret)
        f = open("move_info7", "a", encoding="utf8")
    
        for obj in ret:
            print(obj)
            data = str(obj)
            f.write(data + "
    ")
    
    count = 0
    for i in range(10):
        main(count)
        count += 25
    复制代码
    复制代码
    flags有很多可选值:
    
    re.I(IGNORECASE)忽略大小写,括号内是完整的写法
    re.M(MULTILINE)多行模式,改变^和$的行为
    re.S(DOTALL)点可以匹配任意字符,包括换行符
    re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 w, W, , B, s, S 依赖于当前环境,不推荐使用
    re.U(UNICODE) 使用w W s S d D使用取决于unicode定义的字符属性。在python3中默认使用该flag
    re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释
    复制代码
    # 正则表达式
        # 元字符
        # 量词
        # 小规则
            # 贪婪和惰性匹配
            # 分组命名
                # 如果在匹配的时候遇到了没有特点的内容,
                # 只能通过匹配不想要的内容来从中摘取想要的内容
            # findall和split的分组优先
            # flags参数
        # 每一小段规则的元素的排放顺序
    
    # re模块
        # 基础匹配
        # 分割和替换
        # 代码优化
    # 模块 ****
    # 什么是模块?
    # py文件
    # c语言编译之后的文件
    # 写好的代码集合 直接调用它的功能
    # import time
    # time.sleep()
    
    # 为什么要有模块?
    # 内存空间是有限的,存放在硬盘里,当你需要的时候加载到我的内存
    # 把丰富的功能封装在一个文件里,等用的时候直接导入内存就可以使用
    
    # 有哪些种类的模块?
    # 内置模块
    # 扩展模块
        # django
        # 安装 : pip3 install 模块名
    # 自定义模块
        # 登录
        # 写日志
        # 分模块: 功能独立防止代码过长
  • 相关阅读:
    数据库mysql中编码自动生成
    WPF的项目,ListBox 纵向滚动条不显示
    C# 判断List集合中是否有重复的项
    EF 取出demical数据,但需要去点小数,排序
    数据库SQL优化大总结之 百万级数据库优化方案
    C# 实现OrderBy按多个字段排序
    WPF
    WPF-MVVM学习心德(WinForm转WPF心德)
    WPF MVVM 如何在ViewModel中操作View中的控件事件
    列举出常见的Java面试题100+,我靠这个在十月拿到了阿里的offer
  • 原文地址:https://www.cnblogs.com/molieren/p/9321572.html
Copyright © 2011-2022 走看看