练习1:
要求从斗鱼https://www.douyu.com/g_yz获取网页的源代码保存到本地为douyu.html文件,然后利用正则匹配出来所有的jgp图片,通过协程下载所有图片到本地
注:博客(正则表达式概述)中的“实战演练(爬斗鱼美女照片)”代码不能够实现多任务,以下代码进行优化:
# coding=utf-8
from gevent import monkey
monkey.patch_all()
import gevent
import urllib.request
import re
def download_img(img_name, img_url):
"""下载图片方法"""
req = urllib.request.urlopen(img_url)
img_content = req.read()
with open(img_name, 'wb') as f:
f.write(img_content)
def patch_img_url():
"""正则匹配出来所有的图片地址"""
with open('./douyu.html', 'r', encoding='utf-8') as f:
url_content = f.read()
return re.findall(r"https://.+?\.jpg", url_content)
def main():
img_list_spawn = [] # 定义空列表,保存所有图片下载的协程卵
ret = patch_img_url() # 获得所有的图片信息列表
# 把正则匹配到的地址创建协程
i = 1
for img_url in ret:
img_list_spawn.append(gevent.spawn(download_img, str(i) + '.jpg', img_url))
i += 1
gevent.joinall(img_list_spawn) # joinall等待所有协程执行完毕
if __name__ == '__main__':
main()
练习2:
要求从下面的字符串中提取出来所有有效的邮箱地址和手机号(标准的11位数字手机号):
abc@126.com;03711234567;123.com;13678909876;python@qq.com;1234567;cde@163com;13809098787;hello@qq.com
提示:(?:pattern) 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。
这在使用或字符“(|)”来组合一个模式的各个部分时很有用。
方案一:
import re
str = "abc@126.com;03711234567;123.com;13678909876;python@qq.com;1234567;cde@163com;13809098787;hello@qq.com"
ret = re.findall(r"(\w+?@(?:qq|163|126)\.com)", str, re.A)
ret_mobile = re.findall(r"1\d{10}", str)
ret.extend(ret_mobile)
print(ret)
# ret = re.findall(r"(\w+?@(?:\w+)\.com|1\d{10})", str, re.A)
# print(ret)
方案二:
import re
with open("Emile.txt", "rb") as f:
content = f.read().decode("utf-8")
# 内容清洗
content = re.sub(r"\s", "", content)
# 用“;”将字符串切割成列表
ret = re.split(r";", content)
# print(ret)
# 循环匹配
for data in ret:
r = re.match(r"([a-zA-Z0-9_]+@[0-9a-zA-Z]+\.[a-zA-Z]+$)|([1]\d{10}$)", data)
if r:
if r.group(1):
print("邮箱为:" + r.group())
else:
print("手机号为:" + r.group())