Welcome to kimi's blog

周结(10.30)

周结(10.30)

正则表达式

正则表达式是一门独立的技术,所有的编程语言都可以使用。

正则表达式官方概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特殊字符、以及一些特定字符的组合,组成一个‘规则字符串’,这个‘规则字符串’用来表达对字符串的过滤逻辑

正则表达式之字符串

字符组默认匹配方式是挨个挨个匹配
[0123456789]       匹配0到9任意一个数(全写)
[0-9]              匹配0到9任意一个数(缩写)
[a-z]		       匹配26个小写英文字母
[A-Z]			   匹配26个大写英文字母
[0-9a-zA-Z]		    匹配数字或者小写字母或者大写字母,用来验证十六进制字符
ps:字符组内所有的数据默认都是或的关系


eg: 以[0-9]为例,我们尝试用几个待匹配字符串得到匹配结果

待匹配字符串	匹配结果	    解释
'5'	          ['5']	         [0-9]中有5,所以可以匹配到6
'o'	          ['None']	     字母不符合条件
'79i1'	     ['7','9','1']	 每个匹配到的结果 ,都会从字符串中切出
'11111'	   ['1','1','1','1','1'] 有几个1取几个1

正则表达式之特殊符号

'''特殊符号默认匹配方式是挨个挨个匹配'''
元字符	匹配内容
.	匹配除换行符以外的任意字符
\w	匹配数字、字母、下划线
\W	匹配非数字、非字母、非下划线
\d	匹配数字
^	匹配字符串的开头
$	匹配字符串的结尾
两者组合使用可以非常精确的限制匹配的内容
a|b	匹配a或者b(管道符的意思是或)
()	给正则表达式分组 不影响表达式的匹配功能
[]	字符组 内部填写的内容默认都是或的关系
[^]	取反操作 匹配除了字符组里面的其他所有字符
注意上尖号在中括号内和中括号意思完全不同


补充点:

\s	匹配任意的空白符
\n	匹配一个换行符
\t	匹配一个制表符
\b	匹配一个单词的结尾
\D	匹配非数字
\S	匹配非空白符

eg:
正则	   待匹配字符串	       结果	                      解释
\w	     'ab-ab-a'	      ['a','b','a','b','a']	          匹配字符串中的所有字母\数字\下划线
\w\w	 'ab-ab-a'	      ['ab,'ab']	                  两个\w代表符合条件的两个字符连起来
[^a]	 'ab-ab-a'	      ['b','-','b','-']	一个[。。。]    仅表示匹配一个字符

正则表达式之量词

'''正则表达式默认情况下都是贪婪匹配>>>:尽可能多的匹配'''

*	匹配零次或多次 默认是多次(无穷次)
+	匹配一次或多次 默认是多次(无穷次)
?	匹配零次或一次 作为量词意义不大主要用于非贪婪匹配
{n}	重复n次
{n,}	重复n次或更多次 默认是多次(无穷次)
{n,m}	重复n到m次 默认是m次
ps:量词必须结合表达式一起使用 不能单独出现 并且只影响左边第一个表达式

jason\d{3} 只影响\d



eg:
如正则表达式为[b],待匹配字符串为'bbbb'那么其匹配结果是['b','b','b','b']

而搭配量词,正则为[b]*,待匹配字符串为'bbbb',其匹配结果则为['bbbb']
b可以拿不到或者拿无数次,但是一旦是连着的b,都会被[b]*全收

正则表达式之贪婪与非贪婪匹配

""" 所有的量词都是贪婪匹配如果想要变为非贪婪匹配只需要在量词后面加问号"""
1.贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
2.加上?  会将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串
eg:
    待匹配的文本
        <script>alert(123)</script>
    1.待使用的正则(贪婪匹配)
        <.*>
    请问匹配的内容
        <script>alert(123)</script> 一条
    .* 属于典型的贪婪匹配,使用它,结束条件一般在左右明确指定
    
    2.待使用的正则(非贪婪匹配)
        <.*?>
     请问匹配的内容
     	<script>
		</script>	


几个常用的非贪婪匹配

*?        重复任意次,但尽可能少重复
+?        重复1次或更多次,但尽可能少重复
??        重复0次或1次,但尽可能少重复
{n,m}?    重复n到m次,但尽可能少重复
{n,}?     重复n次以上,但尽可能少重复

转义符

"""斜杠与字母的组合有时候有特殊含义"""
\n     	   匹配的是换行符
\\n			匹配的是文本\n
\\\\n		匹配的是文本\\n
  
  用\来取消\n的特殊含义
ps:如果是在python中使用 还可以在字符串前面加r取消转义

常见的正则表达式

中文字符      [\u4e00-\u9fa5]
双字节字符    [^\x00-\xff]
空白符        \s
Email地址     \w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
网址UPL       ^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+
手机(国内)   0?(13|14|15|17|18|19)[0-9]{9}
手机号码(国内)  [0-9-()()]{7,18}
负浮点数       -([1-9]\d*.\d*|0.\d*[1-9]\d*)
匹配整数        -?[1-9]\d*
腾讯qq号        [1-9]([0-9]{5,11})
邮政编码        \d{6}
ip             (25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)
身份证号码      \d{17}[\d|x]|\d{15}
格式日期        \d{4}(\-|\/|.)\d{1,2}\1\d{1,2}
正整数          [1-9]\d*
负整数          -[1-9]\d*
用户名          [A-Za-z0-9_\-\u4e00-\u9fa5]+



正则在线测试工具:https://tool.chinaz.com/regex/

第三方模块

第三方模块:别人写的模块,一般功能特别强大

要使用第三方模块,首先要下载第三方模块后才可以反复使用(等同内置模块)

如何下载第三方模块?

1.pip工具

注意每个解释器都有pip工具,如果电脑有多个版本的解释器的要注意,使用pip工具的时候一定要注意使用的是哪个pip,否则容易出现使用的A版解释器,使用的是B版解释器下的pip模块
	为了避免pip冲突  我们在使用的时候可以添加对应的版本号     配置系统环境变量 script
        python27      pip2.7
        python36      pip3.6
        python38      pip3.8
	下载第三方模块的句式
		pip install 模块名
	下载第三方模块临时切换仓库
		pip install 模块名 -i 仓库地址
	下载第三方模块指定版本(不指定默认是最新版)
		pip  install 模块名==版本号  -i 仓库地址

2.pycharm提供快捷方式

Settings>>>Project day20>>>Python Interpreter>>>+/双击>>>选择想要的模块名>>>版本型号>>>Install Package

3.第三方模块的下载可能会出现的问题

下载第三方模块可能会出现的问题
	1.报错并有警告信息
		WARNING: You are using pip version 20.2.1;
		原因在于pip版本过低 只需要拷贝后面的命令执行更新操作即可
		d:\python38\python.exe -m pip install --upgrade pip
		更新完成后再次执行下载第三方模块的命令即可
		图如下
	2.报错并含有Timeout关键字
		说明当前计算机网络不稳定 只需要换网或者重新执行几次即可
	3.报错并没有关键字
		面向百度搜索
			pip下载XXX报错:拷贝错误信息
		通常都是需要用户提前准备好一些环境才可以顺利下载
	4.下载速度很慢
		pip默认下载的仓库地址是国外的 python.org
		我们可以切换下载的地址
		pip install 模块名 -i 仓库地址
		pip的仓库地址有很多 百度查询即可
		

requests

equests 模块能够模拟浏览器发送网络请求

1.朝指定网址发送请求获取页面数据(等价于:浏览器地址栏输入网址回车访问)

import requests
res = requests.get('http://www.redbull.com.cn/about/branch')

2.获取bytes类型的网页数据(二进制) content

import requests
res = requests.get('http://www.redbull.com.cn/about/branch')
print(res.content)

3.获得字符串类型的网页数据 text 指定编码‘utf8'

import requests
res = requests.get('http://www.redbull.com.cn/about/branch')
res.encoding = 'utf8'  # 指定编码
print(res.text)  # 获取字符串类型的网页数据(默认按照utf8)

openpyxl

1.excel 文件的后缀名问题

03 版本之前
	.xls
03 版本之后
	.xlsx
	

2.操作excel表格的第三方模块

xlwt往表格中写入数据,wlrd从表格中读取数据
	兼容所有版本的excel文件
openpyx1最近几年比较火热的操作excel表格的模块
	03版本之前的兼容性比较差
注意:还有很多操作excel表格的模块  甚至涵盖了上述的模块>>>>pandas

3.openpyxl操作

------>>>>:学会看官方文档

1.引入模块 创建一个空文档

from openpyxl import Workbook
wb = Workbook()

wb.save(r'2022.xlsx')

2.在一个excel文件内创建多个工作簿

wb1 = wb.create_sheet('学生信息名单')
wb2 = wb.create_sheet('演出名单')
wb3 = wb.create_sheet('演讲名单')

3.还可以修改默认的工作簿位置

wb4 = wb.create_sheet('金牌3期',0)

4.还可以二次修改工作簿名称

wb4.title = 'python24期'
wb4.sheet_properties.tabColor = '1072BA'  # 标题名颜色

5.填写数据的方式

填写数据的方式1
	wb4['F4'] =888
填写数据的方式2
	wb4.cell(row=2,column=2,value='kiki')
	
填写数据的方式3
	wb4.append(['编号','姓名','年龄','爱好'])  # 表头字段
    wb4.append([1,'kiki',18,'music'])
    wb4.append([2,'kimi',19,'read'])
    wb4.append([3,'rose',20,'sing'])
    wb4.append([4,'jenny',28,'shopping'])
    wb4.append([5,'Swift',21,'tv'])
    wb4.append([6,'Tatay',25,'dance'])

6.填写数学公式

wb4.cell(row=1, column=1, value=12321)
wb4.cell(row=2, column=1, value=3424)
wb4.cell(row=3, column=1, value=23423432)
wb4.cell(row=4, column=1, value=2332)
wb4['A5'] = '=sum(A1:A4)'
wb4.cell(row=8, column=7, value='=sum(A1:A4)')

7.保存excel文件

wb.save(r'2022.xlsx')

"""  openpyxl  主要用于数据的写入  至于后续的表单操作它并不很擅长  如果想做更高级的模块pandas"""

pandas

import pandas

data_dict = {
    "公司名称": comp_title_list,
    "公司地址": comp_address_list,
    "公司邮编": comp_email_list,
    "公司电话": comp_phone_list
}
# 将字典转换成pandas里面的DataFrame数据结构
df = pandas.DataFrame(data_dict)
# 直接保存成excel文件
df.to_excel(r'pd_comp_info.xlsx')



# from openpyxl import Workbook
# res=list(res)
# wb = Workbook()
# wb1 =wb.create_sheet('公司名称',0)
# wb1.append(['编号','公司名称','公司地址','公司邮编','公司电话'])
# for data in res:
#     wb1.append(data)
# wb.save(r'comp_info.xlsx')

excel软件正常可以打开操作的数据集在10万左右 一旦数据集过大 软件操作几乎无效
需要使用代码操作>>>:pandas模块

hashlib

1.何为加密

将明文数据处理成密文数据 让人无法看懂

2.为什么要加密

保证数据的安全

3.如何判断数据是否是加密的

一串没有规律的字符串(数字、字母、符号)

4.密文的长短有何讲究

密文越长表示使用的加密算法(数据的处理过程)越复杂

5.常见的加密算法有哪些

md5  base64  hmac sha系列  uuid(帮密文产生函数)

	摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

	摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

6.加密算法基本操作

	import hashlib
    # 1 选择加密算法
    md5 = hashlib.md5()

    # 2.传入明文数据
    md5.update(b'happy')

    # 3.获取加密密文
    res = md5.hexdigest()
    print(res)  # 56ab24c15b72a457069c5ea42fcfc640
如何转为二进制?

    h = '哈哈哈'
    print(h.encode('utf8'))
    print(b'hello')
    print(bytes(h,encoding='utf8'))

加密补充说明

1.加密算法不变, 内容如果相同,那么结果肯定相同

import hashlib
md5 = hashlib.md5()

1.一次性传数据
# md5.update(b'KiKi~good~morning~today')

2,分部分多次传数据
md5.update(b'KiKi~good~')
md5.update(b'morning~')
md5.update(b'today')

输出结果
# res = md5.hexdigest()
# print(res)   # 3bff96a52ce77f5281a3b79da429ec8a

res = md5.hexdigest()
print(res)  # 3bff96a52ce77f5281a3b79da429ec8a

2.加密之后的结果是无法反解密的

明文>>>>密文:只能从明文到密文正向推导   
密文>>no>>明文:无法从密文到明文反向推导
	
常见的解密过程其实是提前猜测了很多种结果
		123    密文
		321    密文
		1314    密文

3.加盐处理

在明文里面添加一些额外的干扰项
import hashlib
# 1.选择加密算法
md5 = hashlib.md5()
# 2.传入明文数据
md5.update('企业为了安全性设置的干扰项'.encode('utf8'))
md5.update(b'girlgoodmorning')
# 3.获取加密密文
res= md5.hexdigest()
print(res)  # 2bc1bd8158917602745ea55c00f4f4c4

在加密的明文中添加一些额外的干扰项,加大数据的安全性,尽量加大被别人解密的可能性

4.动态加盐

干扰项是随机变化的
	eg:当前时间、用户名部分

5.加密实战操作

1.用户密码加密
2.文件安全性校验
3.文件内容一致性校验
4.大文件内容加密
	截取部分内容加密即可

为什么有时候下载的视频比较快?

因为里面有一种叫比特流的技术。
	比特流(BitTorrent)是一种内容分发协议。
	它采用高效的软件分发系统和点对点技术共享大体积文件(如一部电影或电视节目),并使每个用户像网络重新分配结点那样提供上传服务。一般的下载服务器为每一个发出下载请求的用户提供下载服务,而BitTorrent的工作方式与之不同。分配器或文件的持有者将文件发送给其中一名用户,再由这名用户转发给其它用户,用户之间相互转发自己所拥有的文件部分,直到每个用户的下载都全部完成。这种方法可以使下载服务器同时处理多个大体积文件的下载请求,而无须占用大量带宽。
	比特流被人们称之为“群集、散布、集中”的文件传输协议。它由程序员Bram Cohen使用Python评议编写,并且还是代码开源的专利软件,可以自由地下载和传播。

subprocess

模拟操作系统终端   执行命令并获取结果

import subprocess

result = subprocess.Popen(
    'asdas',  # 操作系统要执行的命令
    shell=True,  # 固定配置
    stdin=subprocess.PIPE,  # 输入命令
    stdout=subprocess.PIPE,  # 输出结果
)

print('正确结果',result.stdout.read().decode('gbk'))  # 获取操作系统执行命令之后的正确结果
print('错误结果',result.stderr)  # None  一串符号   获取操作系统执行命令之后的错误结果

logging

1.如何理解日志
	简单的理解为是记录行为举止的操作(历史史官)
2.日志的级别
	五种级别
3.日志模块要求
	代码无需掌握 但要会ctrl+c\ctrl+v并会稍微修改	
	

日志的组成

1.产生日志
2.过滤日志
	基本不用,因为在日志产生阶段就可以控制想要的日志内容
3.输入日志
4.日志格式

代码实现:

import logging
#1.日志的产生(准备原材料)    logger对象
logger= logging.getLogger('购物车记录')
# 2.日志的过滤(剔除不良品)    filter对象>>>:可以忽略  不再使用
# 3.日志的产出(成品)         handler对象
hd1 = logging.FileHandler('a1.log',encoding='utf8')  # 输出到文件中
hd2 = logging.FileHandler('a2.log',encoding='utf8')  # 输出到文件中
hd3 = logging.StreamHandler()   # 输出到终端
# 4.日志的格式(包装)
fm1 = logging.Formatter(
        fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
        fmt='%(asctime)s - %(name)s:  %(message)s',
        datefmt='%Y-%m-%d',
)

# 5.给logger对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)

# 6.给handler绑定formate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)

# 7.设置日志等级
logger.setLevel(10)  # debug

# 8,记录日志
logger.debug('写了半天日志,还是没懂它的用法!!!!')
posted @ 2022-10-30 19:43  魔女宅急便  阅读(55)  评论(0)    收藏  举报
Title