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