- 正则表达式
导入模块 import re
匹配
re.match(‘正则表达式’,‘匹配的内容’) ---------------从头开始匹配返回对象
re.search(‘正则表达式’,‘匹配的内容’) ---------------字符串内查找模式匹配,只要找到第⼀个匹配然后返回对象
re.findall(‘正则表达式’,‘匹配的内容’) ----------------查找所有相匹配的内容返回结果
re.sum(‘正则表达式’,‘替换的内容’,‘匹配的内容’)--------------------查找完后将结果进行替换并返回结果
/match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配;
也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,
match()就返回none\ /
- 分组
正则表达式中,用 () 来进行分组
group(1)表示正则表达式中第一个括号匹配到的内容
group(2)表示正则表达式中第二个括号匹配到的内容
依次类推…
- 匹配符号
- 转义符 \
\. :对.进行转义,使其意义就是.,而不是任意一个字符
\’:对 ’ 进行转义
r模式 :识别正则表达式中的所有 \ ,使其意义就是 \,而不是转义。
- 应用案例 结合mysql ----- 爬电影网站的影片下载地址
- 准备工作-------------------------------------------------------------------------------------------------
- 首先打开mysql服务
- 然后创建movie_db 数据库
- 然后进到movie_db 数据库中穿件 movie_link 数据表,字段为 id, film_name,film_link
- 可以去电影网站看格式,参考飘花电影网站的一个片种,----》飘花电影首页----》动作片
- 动作片的网址即为我们寻找的保存电影列表的网址,应用在我们第一个正则表达式匹配的内容,匹配出该页中所有电影名详情页。
import urllib.request # 这个模块是来打开网站并保存网站对象
import re
import pymysql # 连接mysql数据库模块
def get_link(): # 获取电影名和电影地址
web_obj=urllib.request.urlopen('https://www.piaohua.com/html/dongzuo/index.html')
web_data=web_obj.read() # 读取网站中的所有源码
web_text=web_data.decode() # 将源码编译
download_list=re.findall('正则表达式1',web_text) # 正则表达式匹配网站源码中的电影列表
for i,a,b in download_list: # 对列表进行遍历,取出每一个电影名对应的详情页
name=a+b # 此为电影名称
download_page='网站首页'+i # 拼接出具体网址
download_url_obj=urllib.request.urlopen(download_page)
download_url_data=download_url_obj.read()
download_url_text=download_url_data.decode()
result = re.search(正则表达式2',download_url_text) # 用正则表达式匹配出该页中的下载连接
film_dict[name]=result.group(1) # 以 字典名[电影名]=下载地址 来进行保存
def name_distinct(name): # 对比数据库中已有的数据,防止重复插入
sql='select id from movie_link where film_name=%s limit 1' # 查询操作,查询是否有相同的数据
cur.execute(sql,name)
if cur.fetchone():
return True
else:
return False
if __name__ == '__main__':
conn=pymysql.connect(host='127.0.0.1',user='root',password='mysql',database='movie_db')
cur=conn.cursor()
film_dict={} # 定义空字典保存电影名称和电影下载地址
get_link()
for name,link in film_dict.items():
if name_distinct(name):
print('已经有与之重复的资源')
continue
sql='insert into movie_link values (null,%s ,%s)'
cur.execute(sql,[name,link]) # 插入操作,将电影名和下载地址保存到数据库中
conn.commit() # 提交
cur.close()
conn.close()