RUN__IT # 一个简单的爬妹子代码送福利(正则表达式总结)
先来个诱惑再看代码吧!再来复习下正则表达式吧!
代码很简单,若有建议请留言!
案例
import gevent
from gevent import monkey
import urllib.request
import re
# 打补丁
monkey.patch_all()
def my_download(name,url):
"""下载并保存"""
# 请求
resp = urllib.request.urlopen(url)
# 读取数据
data = resp.read()
# 保存
with open("/home/python/Desktop/mi_zi/"+ name,"wb") as f:
f.write(data)
def get_html():
"""解析出图片网址"""
# 打开文件获取源码。
# "/home/python/Desktop/"+ "url_str.txt"为源码保存的路径及名字,自己找源码保存即可
with open("/home/python/Desktop/"+ "url_str.txt","r") as f:
url_str = f.read()
# 正则表达式匹配
# urls = re.findall(r"https://.*?\.jpg", url_str)
urls = re.findall(r"https://.*?cdnimage.*?\.jpg",url_str)
# 打印图片个数
print(len(urls))
return urls
def main():
"""
爬去虎牙直播妹子图片
https: // www.huya.com / g / 2168
"""
# 解析图片网址
urls = get_html()
li = list()
i = 0
for url in urls:
# print(urls) # 打印出网址
i += 1 # 产生图片名字
# 产生一个卵,并把一个卵添加到列表
li.append(gevent.spawn(my_download,str(i) + ".jpg",url))
# 等待所有协程(卵)结束
gevent.joinall(li)
if __name__ == '__main__':
main()
正则表达式
正则表达式的基本使用
import re
re.match(r"xxx",匹配的字符串) 尝试从字符串的起始位置匹配一个模式匹配成功re.match返回一个匹配对象,否则返回None。可以使用group(num)或groups()匹配对象函数来获取匹配表达式,groups返回是一个元组。
使用正则匹配单个字符
- . 匹配任意一个字符(除了\n) re.S则可以匹配换行
- re.I 表示大小写不敏感
- [1-9] 匹配[]中列举的任意一个字符
- \d 匹配数字,即0-9
- \D 匹配非数字,即不是数字
- \s 匹配空白,即空格、tab键、换行
- \S 匹配非空白
- \w 匹配单词字符。即a-z、A-Z、0-9、_。默认是re.U, 即Unicode编码,可以匹配中文,加上re.A 即可指定ASCLL编码,等价于[a-zA-Z0-9 _ ]
- \W 匹配非单词字符
使用正则表达式匹配多个字符
- * 匹配前一个字符出现0次或者无限次,即可有可无。
- + 匹配前一个字符出现1次或者无限次,即至少有一次
- ? 匹配前一个字符出现一次或0次,即要么有一次,有么没有
- {m} 匹配前一个字符出现m次
- {m,} 匹配前一个字符出现m到无限次
- {m,m} 匹配前一个字符出现从m到n次,逗号两侧不能有空格。
匹配开头结尾边界的使用
- ^ 匹配字符串开头 [^a] 表示的是只要不是a
- $ 匹配字符串结尾
匹配分组的使用
- | 匹配左右任意一个表达式
- (ab) 将括号中字符作为一个分组
- \num 引用分组num匹配到的字符串 \1\2
- (?P) 分组起别名
re高级函数 search、findall、sup、split等的使用
- re.search 扫描整个字符串并返回一个成功的匹配。匹配成功re.search 方法返回一个匹配对象,否则返回None。可以使用group(num)或group()匹配对象函数来获取匹配表达式。
- re.findall 在字符串中找到正则表达式所匹配到的所有子串,并返回一个列表。不需要通过group()取值。
- re.sub 用于替换字符串中的匹配项
- re.split 根据匹配进行切割字符串,并返回一个列表。
re.match 与 re.search 的区别
- re.match 只匹配字符串的开始,如果字符串的开始不符合正则表达式,则匹配失败,函数返回None。而re.search 匹配整个字符串,直到找到一个匹配。
贪婪与非贪婪的特点以及使用方式
- Python里正则匹配默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符。在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪
字符串前加r的作用
- Python中字符串前面加上 r 表示原生字符串