八、正则表达式

  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. 使用distinct消除重复记录的同时又能选取多个字段值

    需求是:我要消除name字段值重复的记录,同时又要得到id字段的值,其中id是自增字段. select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id, ...

  2. [USACO10HOL]牛的政治Cow Politics

    农夫约翰的奶牛住在N ( <= N <= ,)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可以抵达其他所有草地.也就是 ...

  3. CodeForces 1187D Subarray Sorting

    Problem You are given an array \(a_1\),\(a_2\),-,\(a_n\) and an array \(b_1\),\(b_2\),-,\(b_n\). For ...

  4. 区间查询异或最大值——cf1100F,hdu6579

    cf1100F是静态区间查询最大值,有离线的解法,我感觉线段树或者莫队应该都能过 更优秀的解法可以在线并支持修改,可以解决hdu6579,即依次插入每个数,pos[i][j]表示在插第i个数时第j个基 ...

  5. Build安装版的UE4

    在项目中自己编译的引擎分发给团队可以参考以下两个链接 http://jackknobel.com/BuildGraph/Building-an-installed-ue4/ https://docs. ...

  6. 解决异常信息 Caused by: java.lang.IllegalArgumentException: invalid comparison: java.lang.String and java.util.Date

    原来的xml文件 <if test="null != endDate and '' != endDate"> AND rr.REG_DATE <= #{endDa ...

  7. oracle触发器update本表数据

    功能: 1. 允许/限制对表的修改 2. 自动生成派生列,比如自增字段 3. 强制数据一致性 4. 提供审计和日志记录 5. 防止无效的事务处理 6. 启用复杂的业务逻辑 开始 create trig ...

  8. 【转】C++ 模板类的声明与实现分离问题

    链接如下: https://www.cnblogs.com/tonychen-tobeTopCoder/p/5199655.html

  9. 网络处理器(Network Processor)

    网络处理器(Network Processor,简称NP),又可以称为交换芯片,专用于实现核心交换机高速转发功能. 根据网络处理器会议(Network Processors Conference)的定 ...

  10. react 配置ant时遇见的一个Error: Multiple configuration files found. Please remove one: – package.json#babel – .babelrc 解决方案

    这个问题是create react app 里面的package.json里面已经配置了   "babel": {     "presets": [       ...