模块之re模块

  

  八、正则表达式

  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.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()

  # 2.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('(^[1-9])(?P<username>\d{14})(?P<user_pwd>\d{2}[0-9x])?$','452402199311163243')
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


 



猜你喜欢

转载自www.cnblogs.com/mofujin/p/11203519.html