Python数据清洗神器-Re

1 - re.match

  • 简介
    re.match(匹配的规则表达式,源字符串,标志位)
    re.match从字符串的始位置匹配,若始位置匹配成功的话则返回匹配对象,否则返回None
    
  • 知识点
    re.I忽略大小写 
    
    span()获取匹配值的位置,默认num=0,可输入指定组号获取相应的下标值 [元组]
    
    group()默认num=0,可输入指定组号获取相应的匹配值 [字符串]
    
    group() 组号num为0则获取从始位置到终位置的匹配值 [字符串]
    
    groups()从组号1开始,获取所有组号的值 [元组]  例如:('A', 'le and Orange')  
    
  • 代码
    import re
    
    # 源字符串1
    source_text1 = "Apple and Orange"
    #若有匹配值则返回Match对象,否则返回None            
    mat = re.match("(.*)PP(.*)",source_text1,re.I)
    
    print(mat.span(1))
    print(mat.group(1))
    print(mat.groups())
    
  • 打印
    (0, 1)
    A
    ('A', 'le and Orange')
    

2 - re.search

  • 简介
    re.search(匹配的规则表达式,源字符串,标志位)
    re.search搜寻整个字符串并返回第一个成功的匹配。则返回匹配对象,否则返回None
    
  • 知识点
    re.I忽略大小写 
    
    span()获取匹配值的位置,默认num=0,可输入指定组号获取相应的下标值 [元组]
    
    group()默认num=0,可输入指定组号获取相应的匹配值 [字符串]
    
    group() 组号num为0则获取从始位置到终位置的匹配值 [字符串]
    
    groups()从组号1开始,获取所有组号的值 [元组]  例如:('A', 'le and Orange')  
    
    re.search和re.match的区别在于,前者是匹配字符串全部位置,后者是匹配开头字符串位置 (若还是不了解可看下面扩展)
    
  • 代码
    import re
    
    # 源字符串1
    source_text1 = "Apple and Orange"
    #若有匹配值则返回Match对象,否则返回None            
    mat = re.search("(.*)PP(.*)",source_text1,re.I)
    
    print(mat.span(1))
    print(mat.group(1))
    print(mat.groups())
    
  • 打印
    (0, 1)
    A
    ('A', 'le and Orange')
    
  • 扩展
    #!match和search区别
    import re
    
    # 源字符串1
    source_text1 = "Apple and Orange"
    
    #match只会在开头位置匹配,search可在任何位置匹配
    #若有匹配值则返回Match对象,否则返回None   
    mat1 = re.match("le",source_text1,re.I)         
    mat2 = re.search("le",source_text1,re.I)
    print(mat1)  #打印:None
    print(mat2)  #打印:<re.Match object; span=(3, 5), match='le'>
    
    #match只会在开头位置匹配,search可在任何位置匹配
    #若有匹配值则返回Match对象,否则返回None   
    mat3 = re.match("App",source_text1,re.I)         
    mat4 = re.search("App",source_text1,re.I)
    print(mat3)  #打印:<re.Match object; span=(0, 3), match='App'>
    print(mat4)  #打印:<re.Match object; span=(0, 3), match='App'>
    

3 - re.findall

  • 简介
    re.findall(匹配的规则表达式,源字符串,标志位)
    re.findall搜寻整个字符串并返回所有成功的匹配的值。则返回迭代器,否则返回None
    
  • 知识点
    re.I忽略大小写 
    re.search和re.findall的区别在于,前者是匹配字符串全部位置一次,后者是匹配字符串全部位置多次 (若还是不了解可看下面扩展)
    
  • 代码
    import re
    
    # 源字符串1
    source_text1 = "Apple and Orange and Pear"
      
    #findall匹配字符串全部位置多次,返回一个迭代器,否则返回None
    mat = re.findall("and",source_text1)
    print(mat)  
    
  • 打印
    ['and', 'and']
    
  • 扩展
    #!match和search区别
    import re
    
    # 源字符串1
    source_text1 = "Apple and Orange and Pear"
    
    #匹配字符串全部位置一次
    mat1 = re.search("and",source_text1)
    print(mat1.group())  #打印:and
    
    #匹配字符串全部位置多次
    mat2 = re.findall("and",source_text1)
    print(mat2)  #打印:['and', 'and']
    

4 - 正则应用

  • 4-1 网络爬虫 (re.findall)
    import re
    import requests
    
    
    #目标网址
    url = "https://movie.douban.com/subject/34973399/comments?status=P"
    #请求头构造
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
    #基础爬取(适用于无反爬机制的网站)
    response = requests.get(url,headers = headers)
    #获取爬取后的网页源代码(后期用于清洗数据)
    html_source = response.text
    
    #打印网页源代码
    print(html_source)
    
    # .除了换行符,匹配任意字符
    #re.I 忽略大小写
    #re.S .匹配任意字符可包含换行符
    # ?非贪婪模式
    # *匹配0个或多个的表达式。
    # []从该括号内任意匹配一个表达式
    
    #获取标题
    movie_title = re.findall("[<v>]title>(.*)</title>",html_source,re.S)[0].strip()
    #获取所有评论
    movie_comment = re.findall('<span class="short">(.*?)</span>',html_source,re.S)
    
  • 4-2 注册账号验证 (re.match)
    import re
    
    class User:
        @classmethod
        def register(self,email,username,passwd):
            # .代表任意字符(除换行符)
            # *表示匹配0个或多个表达式
            # [qq,163]意思从'q'或者'q'或者','或者'1'或者'6'或者'3'中匹配1个字符
            # {1,3}表示匹配1个字符到3个字符
            # \d 表示任意数字
            # {6,}表示匹配至少6个字符
            # [a-z]表示a到z的所有字母
            email = email if re.match(".*@[qq,163]{1,3}.com",email) else None
            username = username if re.match("\d{6,}",username) else None
            passwd = passwd if re.match("[a-z]{1}.*",passwd) else None
            if not email:
                print("邮件格式不正确")
            if not username:
                print("账号格式不正确,不能小于6位")
            if not passwd:
                print("密码格式不正确,必须以字母开头")
            
    
    
    
    
    if __name__ == "__main__":
        User.register("871937893@163.com","131232","a123123123123")
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值