八、正则表达式

  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位则全部

最新文章

  1. 4.代码同时托管到github和git.oschina.net
  2. HIbernate的基本包——八个,详细条目
  3. SpringMVC解析3-DispatcherServlet组件初始化
  4. 分享一个dapper简单封装
  5. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(35)-文章发布系统②-构建项目
  6. 17-UIKit(UIView的动画)
  7. 办理卡尔加里大学(本科)学历认证『微信171922772』calgary学位证成绩单使馆认证University of calgary
  8. lpc1768ADC使用
  9. CSS常见英语单词属性一览
  10. Ubuntu14.04 设置wifi热点
  11. 在MySQL中使用子查询
  12. Elasticsearch安装配置
  13. HDU6321 Dynamic Graph Matching (杭电多校3C)
  14. As 400错
  15. CC攻击原理及防范方法和如何防范CC攻击
  16. ux.form.field.Password 密码与非密码状态切换
  17. 计算多数的乘积(Python实现)
  18. 集群RedHat6.5+JDK1.8+Hadoop2.7.3+Spark2.1.1+zookeeper3.4.6+kafka2.11+flume1.6环境搭建步骤
  19. WPF编程,指定窗口图标、窗口标题,使得在运行状态下任务栏显示窗口图标的一种方法。
  20. Redis 5种数据结构及其使用场景举例--STRING

热门文章

  1. 微信小程序自定义底部导航栏组件+跳转
  2. LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)
  3. vux组件样式大合集
  4. 《SQL Server 2012 T-SQL基础》读书笔记 - 4.子查询
  5. xfs格式化、ext4格式化并指定inode区别
  6. SynchronousQueue 源码分析
  7. oracle查询语句,根据中文的拼音排序
  8. TC39 - 新特性
  9. QCOW2/RAW/qemu-img 概念浅析
  10. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_6_练习_转换文件编码