八、正则表达式

  1.1首先我们先了解re模块与正则表达式的关系:

 re模块与正则表达式之间的关系
     正则表达式不是python独有的 它是一门独立的技术所有的编程语言都可以使用正则,但是如果你想在python中使用,你就必须依赖于re模块
  作用:正则就是用来筛选字符串中的特定的内容的
  语法:[]字符组 一个字符组里面表达的是或的关系而且只能取其一

网站手机号校验功能示例:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/

与re模块没有任何关系,仅仅是测试正则表达式:http://tool.chinaz.com/regex

  1.2 元字符与量词的关系

  

# 元字符表:. 是匹配所有 ^以什么为开头 以什么为结尾$  ^jason$ 是百分百精准匹配 多一个少一个都不行                       

# a|b abc|ab 注意:或的模式匹配必须是长的放前面 ab可以先匹配 abc则匹配abc                                 

# 贪婪匹配和非贪婪匹配:正则匹配的时候默认正则都是贪婪匹配模式(尽量匹配多的) 可以在贪婪匹配后面加一个量词(?匹配零个没有匹配零个或有则匹配则一个)     

# 在使用元字符和量词的时候量词必须放在元字符后面,切只对紧挨的元字符有限制作用
                                                                                 

  九、re模块

  

  # 阿姨 三个必须掌握的方法

  1.1 findall()
      # res = re.findall('表达式','待匹配的字符串')

# 1.res = re.findall('表达式','待匹配的字符串')
# res = re.findall('a','eva egon jason')
# print(res)  # ['a', 'a']  返回一个列表 将所有符合的结果存到列表里面
# res = re.findall('[a-z]*','eva egon jason')  # * 零个或者多个
# print(res)  # ['eva', '', 'egon', '', 'jason', '']
# res = re.findall('[a-z]+','eva egon jason')
# print(res)  # ['eva', 'egon', 'jason'] + 一个或者多个
                                                         

  1.2  re.search()

  # res1 = re.search('表达式','待匹配的字符串')


 res1 = re.search('a','eva egon jason tank')
 res2 = re.search('l','eva egon jason tank')
 print(res1,type(res1)) #  None type:<class '_sre.SRE_Match'>
 <_sre.SRE_Match object; span=(2, 3), match='a'>
 print(res1.group())
 小结:search 将表达式和待匹配的字符串从左到右逐一查找直到第一个匹配上立马返回匹配信息     查找的返回的结果是一个对象,需要调用group()方法得到匹配的字符串
     如果是None 调用group()则会报错。
 解决方案:可以判断if res: 再执行打印结果
 if res1:
     print(res1.group())                                                                                                                 

  1.3 re.match()

  # res3 = re.match('表达式','待匹配的字符串')
# res3 = re.match('表达式','待匹配的字符串')
# res3 = re.match('a','eva egon jason tank')
# res4 = re.match('e','eva egon jason tank')
# print(res3.group())  # 'NoneType' object has no attribute 'gr
# if res4:
#     print(res4.group())
# # 小结:
# 1.match查找规则是match只会匹配字符串的开头部分(单个开头或整体)
# 2.返回的是一个对象需要调用group()方法才能拿到匹配的字符串结果
                                                               
   小结:
   search 和 match 的异同点:  
 search 和 match 的异同点:
 1.相同点:
   # 1.语法句式一样;
   # 2.匹配返回的结果都是一个对象,需要调用group()才能得到匹配的字符串;
   # 3.如果返回的是一个None,在调用group()会报错                                                      

 2.不同点:
   # 1.search:匹配查找从左到右只要第一个匹配上,不会继续往下找,直接返回结果
   # 2.match: 只匹配开头,所以匹配必须是以表达式的单个字符换或一个整体字符串为开头否者返回None
                                                                                       

9.2 re模块的其他方法: 

  # 1 re.split()  
# re模块的其他方法:
 # 1 re.split()
# res2 = re.split('[ab]','abcd')
# print(res2)  #  ['','','cd']     

  

 # 2 re.sub()
# res2 = re.sub('\d','HA','eav3egon4jason56')
# print(res2)  # 第一个是表达式;第二个是要更新的内容;第三个是待匹配的字符串
#  eavHAegonHAjasonHAHA                                                        
 # 3 re.subn()
# res3 = re.subn('\d','HA','eav3egon4jason56',3)
# print(res3)  # ('eavHAegonHAjasonHAHA', 4) 返回的是一个元祖和更新的个数,
 # ('eavHAegonHAjasonHA6', 3)
 #  ('eavHAegonHAjasonHA6', 3)后面的参数是可以更改的是表示匹配到的数字这个数和更换数
                                                                               
 # 4 re.compile()
# obj = re.compile('\d{3}')
# print(obj) #  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
# res4 = obj.findall('eee6a6a6aw7ww123q456q9p')
# print(res4 )  # 给定义规则按照obj对象去匹配3个数字为一组的字符串
# ['123', '456']  # findall 配配所有结果                 

# res5 = obj.search('ee666p999ewrewf3p218')
# print(res5.group())  # 只要匹配到,就不会往下匹配了
#
# res6 = obj.match('123dsf5')
# print(res6.group())  # 是否以3ge数字开头 不然直接报错
#
                                                   
 9.3 # ——————————————————扩展——————————————————
# res7 = re.search('(^[1-9])(\d{16})([0-9x])$','452402199312233318' )
# print(res7.group())
# print(res7.group(1))
# print(res7.group(2))
# print(res7.group(3))
 # 补充有名分组
# 补充有名分组
# res8 = re.match('(^[1-9])(\d{14})(\d{2}[0-9x])?$','452402199311163243')
# print(res8.group())
# print(res8.group())
# print(res8.group())
# print(res8.group())
 # 有名分组:(?P<username>)
ret4 = re.search(')
print(ret4.group('username'))

print(ret4.group('user_pwd'))
# 分组
# ret = re.search('www.(baidu|oldboy).com','www.oldboy.com')
# ret1 = re.findall('www.(baidu|oldboy).com','www.oldboy.com')
# print(ret.group())  #   www.oldboy.com 无视分组
# print(ret1)  #  ['oldboy']
# 正对findall()没有group()取值的方法,所以默认分组名优先获取的结果
 # 取消分组在所属括号内(?:)
# 取消分组在所属括号内(?:)
# ret2 = ret1 = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
# print(ret2)  # ['www.oldboy.com'] 取消分组 直接匹配结果

#  爬虫:(写作业)

import re
import json
from urllib.request import urlopen

"""
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
https://movie.douban.com/top250?start=75&filter=

<li>
            <div class="item">
                <div class="pic">
                    <em class="">1</em>
                    <a href="https://movie.douban.com/subject/1292052/">
                        <img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        </a>

                            <span class="playable">[可播放]</span>
                    </div>
                    <div class="bd">
                        <p class="">
                            导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
                            1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
                        </p>
                        <div class="star">
                                <span class="rating5-t"></span>
                                <span class="rating_num" property="v:average">9.6</span>
                                <span property="v:best" content="10.0"></span>
                                <span>1489907人评价</span>
                        </div>

                            <p class="quote">
                                <span class="inq">希望让人自由。</span>
                            </p>
                    </div>
                </div>
            </div>
        </li>
"""

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 + "\n")

count = 0
for i in range(10):
    main(count)
    count += 25

# - 编写验证身份证的正则\
# 身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部

模块之re模块的更多相关文章

  1. python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

  2. Python模块之常用模块,反射以及正则表达式

    常用模块  1. OS模块 用于提供系统级别的操作,系统目录,文件,路径,环境变量等 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("di ...

  3. python基础知识8——模块1——自定义模块和第三方开源模块

    模块的认识 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...

  4. Python引用模块和查找模块路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...

  5. threading模块和queue模块实现程序并发功能和消息队列

    简介: 通过三个例子熟悉一下python threading模块和queue模块实现程序并发功能和消息队列. 说明:以下实验基于python2.6 基本概念 什么是进程? 拥有独立的地址空间,内存,数 ...

  6. VBA标准模块与类模块

    大家通过之前的介绍,已知道怎么将一个空模块插入VBA的工程中.从插入模块中可以看到,模块有有两种——标准模块与类模块.类模块是含有类定义的特殊模块,包括其属性和方法的定义.在后面会有介绍与说明. 随着 ...

  7. ansible定时任务模块和用户组模块使用

    接上篇,还是一些基础模块的使用,这里主要介绍的是系统模块的使用. 下面例子都进行过相关的实践,从而可以直接进行使用相关的命令. 3.用户模块的使用 用户模块主要用来管理用户账号和用户的属性(对远程主机 ...

  8. ansible服务模块和组模块使用

    本篇文章主要是介绍ansible服务模块和组模块的使用. 主要模块为ansible service module和ansible group moudle,下面的内容均是通过实践得到,可以直接运行相关 ...

  9. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

  10. 第五十五节,IO多路复用select模块加socket模块,伪多线并发

    IO多路复用select模块加socket模块,伪多线并发,并不是真正的多线程并发,实际通过循环等待还是一个一个处理的 IO多路复用,lo就是文件或数据的输入输出,IO多路复用就是可以多用户操作 IO ...

随机推荐

  1. java 如何实现大文件上传下载(传输)各种格式

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  2. 【bzoj3564】 [SHOI2014]信号增幅仪

    题目描述: 无线网络基站在理想状况下有效信号覆盖范围是个圆形.而无线基站的功耗与圆的半径的平方成正比. 现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站.... 就在你拿起键盘准备开 ...

  3. 企业级技术解决方案:hbase+es

    1:需求: 解决海量数据的存储,并且能够实现海量数据的秒级查询 Hbase是典型的nosql,是一种构建在HDFS之上的分布式.面向列的存储系统,在需要的时候可以进行实时的大规模数据集的读写操作:但是 ...

  4. android 后台运行service实现和后台的持续交互

    在项目中有这么一种需求 需要后台开启服务,时刻记录用户和软件的交互行为,一旦交互发生,就向服务器测发送一条消息 解决方案: 一.创建一个service服务类 在service中开启一个线程,servi ...

  5. ECharts插件介绍(图表库)

    ECharts是一个非常好用的插件,用于进行 树状图,折线图,饼图,地图等等,系列视图的绘制.(详情看官网) 了解: AMD:模块化开发方式: 引入文件后:console.log(echarts) / ...

  6. MySQL主从复制中replicate-ignore-db replicate-wild-ignore-table的应用

    MySQL主从复制中replicate-ignore-db replicate-wild-ignore-table的应用 replicate-ignore-dbreplicate-wild-ignor ...

  7. DAY 4 下午

    一些图论的知识(主要补充一下之前不了解的和比较重要) 竞赛图:完全图上的边加方向 仙人掌:每一条边至多属于一个环 前序:中左右 中序:左中右 后序:左右中 先加进去无向边 把每一个联通块看成一个大点 ...

  8. winform最小化及添加右键

    private void PrintService_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWind ...

  9. FOUC(Flash Of Unstyled Content)文档样式闪烁

    今天看面试题看到了这个新名词..我以前是没有发现过这种状况,应该是我一直都是将加载 CSS 的 link 标签写到 head 里的缘故吧. 什么是文档样式闪烁(Flash Of Unstyled Co ...

  10. .Net Core 使用 System.Drawing.Common 在CentOS下报错

    .Net Core控制台项目,添加了 System.Drawing.Common 引用 #locate libdl /usr/lib64/libdl-2.17.so /usr/lib64/libdl. ...