正则表达式

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

# 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    #匹配数字
\b    #匹配单词的开始或结束
^     #匹配字符串的开始
$     #匹配字符串的结束

##次数匹配:
*     #重复零次或更多次
+     #重复一次或更多次
?     #重复零次或一次
{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 \033[32msuccessfule\033[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)
posted @ 2017-03-01 10:25  xiaoganghu  阅读(201)  评论(0编辑  收藏  举报