Python学习 Day44 数据解析-正则表达式 08

正则表达式

一、正则表达式概述

正则表达式:

  • 是一个特殊的字符序列,作用是帮助用户便捷地检查一个字符串是否与某种模式匹配
  • Python的正则模块是re,是Python的内置模块,不需要安装,导入即可

正则语法

元字符 说明
. 匹配任意字符
^ 匹配字符串的开头
$ 匹配字符的末尾
* 匹配前一个元字符0到多次
+ 匹配前一个元字符1到多次
? 匹配前一个元字符0到1次
{m} 匹配前一个元字符m次
{m,n} 匹配前一个元字符m到n次
{m.n}? 匹配前一个元字符m到n次,并且取尽可能少的情况
\ 对特殊字符进行转义
[] 一个字符的集合,可匹配其中任意一个字符
| 逻辑表达式“或”,如a|b代表匹配a或者b
(…) 括号中表达式作为一个元组,find_all在有组的情况下,只显示组的内容

特殊序列

元字符 说明
\A 只在字符串开头进行匹配
\b 匹配位于开头或者结尾的空字符串
\B 匹配不位于开头或者结尾的空字符串
d 匹配任意十进制数,相当于[0-9]
\D 匹配任意非数字字符,相当于[^0-9]
\s 匹配任意空白字符,相当于[\t\n\r\f\v]
\S 匹配任意非空白字符,相当于[^\t\n\r\f\v]
\w 匹配任意数字、字母、下划线,相当于[a-z A-Z 0-9]
\W 匹配任意非数字、字母、下划线,相当于[^a-z A-Z 0-9]
\Z 只在字符串结尾进行匹配
[\u4e00-\u9fa5] 匹配中文

正则处理函数

函数 说明
re.match(pattern,string,flags=0) 尝试从字符串的开始位置匹配一个模式,如果匹配成功,就返回一个匹配成功的对象,否则返回None
re.search(pattern,string,flags=0) 扫描整个字符串并返回第一次成功匹配的对象,如果匹配失败,就返回None
re.findall(pattern,string,flags=0) 获取字符串所有匹配的字符串,并以列表的形式返回
re.sub(pattern,repl,string,count=0,flags=0 用于替换字符串中的匹配项,如果没有匹配的项,则返回没有匹配的字符串
re.compile(pattern[,flag]) 用于变异正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()函数使用

二、正则表达式基本使用

import re

s = 'Istudy Python3.8 every day'
print('-------------match()方法,从起始位置开始匹配-------------------')
print(re.match('I',s).group())
print(re.match('\w',s).group())
#匹配任意字符
print(re.match('.',s).group())

print('---------------search()方法,从任意位置开始匹配,返回第一个---------------')
print(re.search('study',s).group())
print(re.search('s\w',s).group())

print('----------------findall方法,从任意位置开始匹配,匹配多个------------------')
print(re.findall('y',s)) #结果为列表
print(re.findall('Python',s))
print(re.findall('P\w+.\d',s))
print(re.findall('P.+\d',s))

print('-----------------sub方法,替换--------------------------')
print(re.sub('study','like',s))
print(re.sub('s\w+','like',s))

-------------match()方法,从起始位置开始匹配-------------------
I
I
I
---------------search()方法,从任意位置开始匹配,返回第一个---------------
study
st
----------------findall方法,从任意位置开始匹配,匹配多个------------------
['y', 'y', 'y', 'y']
['Python']
['Python3.8']
['Python3.8']
-----------------sub方法,替换--------------------------
Ilike Python3.8 every day
Ilike Python3.8 every day

Process finished with exit code 0

三、案例

下载糗事百科小视频
请求的URL:https://www.qiushibaike.com/video
在这里插入图片描述
加入请求头
在这里插入图片描述
查找资源所在位置
在这里插入图片描述
注意:直接复制代码可能会产生搜索结果为0的问题,所以在pycharm中直接搜索“.mp4”即可
在这里插入图片描述
在这里插入图片描述
使用上面的参数只能返回一条数据,返回多条数据需要使用正则
在这里插入图片描述
结果
在这里插入图片描述
但是所获得的上图中数据链接路径不完整,需要拼接上“https”,使之成为一个完整的网址
在这里插入图片描述
解决每个链接都需要向服务器发生请求的问题
在这里插入图片描述
需要新建一个video目录
在这里插入图片描述


具体实现代码

import requests
import re

url = 'https://www.qiushibaike.com/video'
#嵌入请求头
headers = {
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'}
#发送请求
resp = requests.get(url,headers=headers)
#print(resp.text)

#使用正则表达式解析数据
info = re.findall('<source src="(.*)" type=\'video/mp4\' />',resp.text)
#print(info)

#拼接“https”,使之成为一个完整网址
lst = [] #列表存储拼接后的网址
for item in info:
    lst.append('https:'+item)
#print(lst) #输出结果为可以点击跳转的网址

#解决每个链接都需要向服务器发送请求的问题
count = 0
for item in lst:
    count+=1
    resp=requests.get(item,headers=headers)
    #将得到的视频转成二进制存储
    with open('video/'+str(count)+'.mp4','wb') as file:  #将视频以二进制形式写入到video文件夹中,并为视频命名
        file.write(resp.content)
print('视频下载完毕')

结果存储在文件夹中寻找
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ShengXIABai/article/details/115704950