• 正则表达式


    正则表达式是用来匹配、捕获特定字符串的工具;之后,我们还可以对匹配到、捕获到的对象进行处理,比如替换

    # encoding: UTF-8
    import re
    
    # 将正则表达式编译成Pattern对象
    pattern = re.compile(r'hello')
    # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
    
    match = pattern.match('hello world!')
    if match:
        # 使用Match获得分组信息
        print match.group()
    # 输出 ###
    # hello`
    

    常用的匹配规则有:

    ##字符匹配:
    .     #匹配除换行符以外的任意字符
    w    #匹配字母或数字或下划线或汉字
    s    #匹配任意的空白符
    d    #匹配数字
        #匹配单词的开始或结束
    ^     #匹配字符串的开始
    $     #匹配字符串的结束
    
    ##次数匹配:
    *     #重复零次或更多次
    +     #重复一次或更多次
    ?     #重复零次或一次
    {n}   #重复n次
    {n,}  #重复n次或更多次
    {n,m} #重复n到m次
    
    match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]): 
    

    这个方法将从string的pos下标处起尝试匹配pattern;如果pattern结束时仍可匹配,则返回一个Match对象;如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None。
    pos和endpos的默认值分别为0和len(string);re.match()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。
    注意:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'。

    search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]): 
    

    这个方法用于查找字符串中可以匹配成功的子串。从string的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回一个Match对象;若无法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。 `pos和endpos的默认值分别为0和len(string));re.search()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。

    match()函数只检测RE是不是在string的开始位置匹配,
    search()会扫描整个string查找匹配;
    也就是说match()只有在0位置匹配成功的话才有返回,
    如果不是开始位置匹配成功的话,match()就返回none。

    # encoding: UTF-8 
    import re 
    # 将正则表达式编译成Pattern对象 
    pattern = re.compile(r'world') 
    
    # 使用search()查找匹配的子串,不存在能匹配的子串时将返回None 
    # 这个例子中使用match()无法成功匹配 
    match = pattern.search('hello world!') 
    if match: 
        # 使用Match获得分组信息 
        print match.group() 
    
    ### 输出 ### 
    # world
    

    re.findall 遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表 格式:
    re.findall(pattern,string,flags=0)

    import re
    >>> p = re.compile(r'd+')
    >>> print p.findall('df23434fasd')
    ['23434']
    

    实例:爬取糗事百科图片

    import urllib,urllib2,re,os
    
    src_regex = r'<img src="(.*?)"'
    p = re.compile(src_regex)
    url = 'http://www.qiushibaike.com/pic/'
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'}
    
    re = urllib2.Request(url = url,headers=headers)
    
    result = urllib2.urlopen(re).read()
    print result
    img_list = p.findall(result)
    img_list = ['http:'+url for url in img_list]
    for download_url in img_list:
        if download_url.endswith('.jpg'):
            filename = download_url.split('/')[-1]
            if not os.path.isdir('images'):
                os.mkdir('images')
            urllib.urlretrieve(download_url,'images/%s'%filename)
            print "from url:%s downurl:%s 33[32msuccessfule33[0m"%(download_url,filename)
    
    
    
    

    爬取妹子图

    #coding:utf-8
    
    import re,threading,requests,urllib2,urllib,os
    
    import time
    
    thread ,page_urls,page_num = [],[],1
    image_regx = re.compile('<img src="(.*?)" alt=".*">')
    url = 'http://www.meizitu.com/a/list_1_1.html'
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'}
    
    def get_images(url,page_num):
        req = urllib2.Request(url = url,headers=headers)
        page_info = urllib2.urlopen(req).read().decode('gb2312').encode('gbk')
        image_urls = [url for url in re.findall(image_regx,page_info)]
        # print image_urls
        save = "images"+os.sep+str(page_num)
        1 if os.path.exists(save) else os.makedirs(save,mode=777)
    
        for download in image_urls:
            print download
    
            req = requests.get(download,stream=True,headers=headers)
            with open(save+os.sep+str(time.time())+(download.split('/')[-1]),'ab+') as f:
                f.write(req.content)
                print "%s download done..."%download
    
    
    
    
    get_images(url,page_num)
    
  • 相关阅读:
    面试突击44:volatile 有什么用?
    面试突击42:synchronized和ReentrantLock有什么区别?
    面试突击45:为什么要用读写锁?它有什么优点?
    微信内打开链接,跳转到公众号关注页面
    阿里流水线使用教程
    windows自带 扫描修复系统
    20年前的网站页面
    微服务之 Consul 单机版到集群搭建详细步骤【转】
    iOS修改项目名称
    从零开始学YCFramework之初步
  • 原文地址:https://www.cnblogs.com/flyhgx/p/6483040.html
Copyright © 2020-2023  润新知