python2基础学习(三)——模块、正则表达式+爬虫

本笔记未加整理,占供自己查看

目录

一、模块

二、正则表达式


一、模块


可以自己写一个1.py文件
然后 import 1

如果cal.py定义了add(x,y)

则在另一个文件中
import cal
print cal.add(1,2)

__name__  内置属性
如果是主体调用 则返回__main__
如果是导入模块里面的,则返回的模块的名字
根据这个可以选择调用的模块

程序导入模块的顺序
先在当前目录中查找,导入模块
再从其他的目录导入

如果要删除,要删除.py和.pyc
-------包------
** 在该目录创建__int__.py文件,则该目录为一个包
import lib.string   #即导入lib文件夹的string模块
则lib为一个包

如果条用string里的函数
则 lib.string.replace()
指明哪个包里面的函数

可以用import ,import as,from import

cal.jia()
import cal as c   //换一个名字
c.jia()

from cal import jia   从cal包中导入jia()函数
则jia()

 

二、正则表达式


import re   导入re模块
字符匹配
-普通字符
    字母和字符会和自身匹配
-元字符
. ^ $ * + ? {} [] \ | ()

[]
    常用来制定一个字符集:[abc] [a-z]
    元字符在字符集中不起作用:[akm$],即为普通字符
    补集匹配不在区间范围内的字符:[^5]

    >>>import re
    >>>s='abc'
    >>>s=r'abc'    //取消\转义
    >>>re.findall(s,"aaaaaaaaaaa")
    []
    >>>re.findall(s,"abcaaaaaabcaaaa")
    ['abc','abc']
    
    >>>st="top tip tqp twp tep"
    >>>res=r"top"        规则
    >>>re.findall(res,st)
    ['top']
    >>>res=r'tip'
    >>>re.findall(res,st)
    ['tip']
    >>>res=r't[io]p'  进行匹配 tip或者top
    >>re.findall(res,st)
    ['top','tip']
    
    >>>res=r"t[^io]p"    //取反
    >>>re.findall(res,st)  
    ['tqp','twp','tep']
^    行首
    匹配行首。
例子
    >>>s='hello world,hello boy'
    >>>r = r"hello"
    >>>re.findall(r,s) 用r规则匹配s字符串
    ['hello','hello']
    
    >>>r=r"^hello"
    >>>re.findall(r,s)  s中hello必须在行首,否则返回[]
    ['hello']
$   行尾
    >>>r=r"boy$"
    >>>re.findall(r,s)
    ['boy']
    
    >>>r=r"x[0123456789]x"
    >>>re.findall(r,'x1x')
    >>>r=r"x[0-9]x"   更方便 或者[a-zA-Z0-9]
    
    >>>r=r"^abc"   行首
    >>>re.findall(r,"abc")
    ['abc']
    >>>re.findall(r,'aa abc')
    []
    >>>re.findall(r,'^abc')
    []
    >>>re.findall(r,'^abc ^abc ^ab')  补集
    []
如何将^作为普通字符 \^ 转义
    
\    转义
    \d  代表所有数字[0-9]
    \D    代表[^0-9]
    \s    代表[\t\n\r\f\v] 任何空白字符
    \S    带表非任何空白字符 [^\t\n\r\f\v]
    \w    匹配任何字母数字字符,[a-zA-Z0-9]
    \W    匹配任何非字母数字字符,相当于[^a-zA-Z0-9]
    
    匹配010-12345678电话号码
    >>>r=r"^010-\d\d\d\d\d\d\d\d\d"
    >>>re.findall(r,'010-87654321')
       ['010-87654321']
      #从过后面的数字不够,则不能匹配
      
     >>>r=r"^010-\d{8}" 重复\d 8次
        
*
    >>>r=r"ab*"    将*前面的重复0到多次,即b可以出现0次或多次
    >>>re.findall(r,'a')
    ['a']
    >>>re.findall(r,'ab')
    ['ab']
    >>>re.findall(r,'abbbbbb')
    ['abbbbbb']

+
    和*的区别是至少有一次
    >>>r=r"ab+"
    >>>re.findall(r,'a')
    []
    >>>re.findall(r,'ab')
    ['ab']
    >>>re.findall(r,abbb)
    ['abbb']
    
?  ?前面的字符可有可无,一次或0次
    匹配010-12345678电话号码,且中间的-可有可无
    >>>r=r"^010-*\d{8}$"
    >>>re.findall(r,"01012345678")
    ["01012345678"]
    >>>re.findall(r,'010-12345678')
    ['010-12345678']
    >>>re.findall(r,'010--12345678')
    ['010--12345678']    不好

    >>>r=r"^010-?\d{8}"  
    >>>re.findall(r,'010--12345678')
    []    

贪婪模式
    >>>r=r'ab+'
    >>>re.findall(r,'abbbbbbbbbb')
    ['abbbbbbbbbb']   //做最大的模式,及贪婪
    >>>r=r'ab+?'  //取消贪婪模式
    >>>re.findall(r,'abbbbbbbbbb')
    ['ab']
    
{m,n}   知道m个,至多n个
    >>>r=r'a{1,3}'
    >>>re.findall(r,'a')
    ['a']
    >>>re.findall(r,'aa')
    ['aa']
    >>>>>>re.findall(r,'aaaa')
    ['aaa','a']    分割
可以忽略m或者n
    忽略m代表0-n
    忽略n代表m-20亿
    
    
    >>>r=r"\d{3,4}-?\d{8}"
    >>>p_tel=re.compile(r)  编译产生一个匹配对象
    >>>p_tel.findall('010_12345678')
    ['010-12345678']
    >>>p_tel.findall('010_123456789')
    ['010-12345678']
    //匹配csvt  不区分大小写
    >>>csvt_re=re.compile(r'csvt',re.I)
    >>>csvt_re.findall('Csvt')
    ['Csvt']
    
执行匹配
    match()  特点:匹配数据在行首
        >>>x=csvt_re.match('csvt hello')//匹配成功返回匹配对象
        
    serch()   任何位置都可以
        
    findall()  返回列表
        
    finditer() 返回迭代器
        >>>x=csvt_re.finditer()
        >>>x.nest()  返回match对象
        
match对象的方法
    group()
        >>>x.group()
        ['csvt']
    start()
    
    end()
    
    span()
     
re顶级函数
    sub()
        >>>s="hello csvt"
        >>>s.replace('csvt','python')
        'hello python'
        sub可以实现上面功能
        >>>rs=r'c..t'
        >>>re.sub(re,'python','csvt caat cvvt cccc')
        'python python python cccc'
    subn()
        >>>re.sub(re,'python','csvt caat cvvt cccc')
            ('python python python cccc',3) //返回匹配的个数
    split()  //切割
        像前面的切割ip的例子
        >>>s="123+456-789*000"
        >>>re.splite(r'[\+\-\*/]',s)   转义
        ['123','456','789','000']
        
dir(re)  列出res的属性和方法
help(re) 查看re模块手册
    

编译标志
Dotall,S        使.匹配包括换行在内的所有字符
Ignorecase,I    使匹配对大小写不敏感
Locale,L        做本地化识别(locale-aware)匹配.法语等
Multiline,M        多行匹配,影响^和$
Verbose,X        能够使用REs的verbose状态,使之被组织得更清晰易懂


S
    >>>r=r"csvt.net"
    >>>re.findall(r,'csvtonet')
    ['csvtnet']
    >>>re.findall(r,'csvt\nnet')
    >>>[]
    >>>re.findall(r,'csvt\nnet',re.S)
    >>>['csvt\nnet']
M
    >>>s="""
        hello csvt
        csvt hello
        hello csvt hello
        csvt hehe
        """
    >>>r=r'^csvt'
    >>>re.findall(r,s)
    []
    >>>re.findall(r,s,re.M)
    ['csvt','csvt']
X
    >>>tel=r"""
            \d{3,4}
            -?
            \d{8}
            """
    >>>re.findall(tel,'010-12345678')
    >>>re.findall(tel,'010-12345678',re.X)
    ['010-12345678']
    
分组 ( he )
    匹配邮箱地址
    >>>email=r"\w{3}@\w+(\.com|\.cn)"
    >>>re.match(email,'zzz@csvt.com')
    #匹配成功 , 如果为‘空’则没有匹配成功
    
    >>>re.findall(email,'zzz@csvt.com')
    ['.com']   #优先返回分组内数据
    
    s="hello src=csvt yes hello src=pythont yes""
    >>>r=r'hello src=.+ yes'
    >>>re.findall(r,s)
    ['hello src=csvt yes','hello src=pythont yes']
    
    >>>r=r'hello src=(.+) yes'
    >>>re.findall(r,s)
    ['csvt python']
    
    
爬虫: 下载贴吧得图片
    查看源代码
    图片: img标签
    获取src后面得数据
    
    
    获取源代码
vim getjpg.py

    #!/usr/bin/python
    import re
    import urllib
    
    def getHtml(url):
        page = urllib.urlopen(url)
        html = page.read()
        return html
        
    def getImg(html):
        reg = r'src="(.*?\.jpg)" width'
        imgre = re.compile(reg)
        imglist = re.findall(imgre,html)
        x = 0
        for imgurl in imglist:
            urllib.urlretrieve(imgurl,'%s.jpg' %x);
            x+=1
            
    html = getHtml(<网址>)
    getImg(html)
    
    
    
    
    
    
    
    
    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值