目录
- 1. 正则表达式
- 2. 第三方模块
- 3. 网络爬虫简介
- 4. 加密模块
- 5. 日志模块
- 6. 三层架构
1. 正则表达式
1.1 简介
1.1.1 定义
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
1.1.2 理解
该知识点不属于任何一门编程语言,是一个独立的学科,主要用于数据的查找与筛选
1.1.3 总结
正则表达式本质上就是使用一些符号的组合产生一些特殊的含义,然后去字符串中筛选出符合条件的数据
1.2 正则表达式之字符
1.2.1 网址
正则表达式线上测试网址:http://tool.chinaz.com/regex/
1.2.2 结论
字符组在没有量词修饰的情况一次只会针对一个数据值
1.2.3 [0-9]
匹配0到9之间的任意一个数字(包括0和9)全称是:[0123456789]
1.2.4 [A-Z]
匹配A到Z之间的任意一个字母(包括A和Z)全称是:[ABC…XYZ]
1.2.5 [a-z]
匹配a到z之间的任意一个字母(包括a和z)全称是:[abc…xyz]
1.2.6 [0-9a-zA-Z]
在中括号内编写的多个数据值彼此都是或的关系, 数字,小写字母,大写字母都可以
1.3 正则表达式之特殊符号
1.3.1 结论
特殊符号在没有量词修饰的情况一个符号一次只会针对一个数据值
1.3.2 字符
元字符 | 匹配内容 |
---|---|
. | 匹配除换行符以外的任意字符 |
/w | 匹配字母或数字或下划线 |
/s | 匹配任意的空白符 |
/d | 匹配数字 |
/n | 匹配一个换行符 |
/t | 匹配一个制表符 |
/b | 匹配一个单词的结尾 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
/W | 匹配非字母或数字或下划线 |
/D | 匹配非数字 |
/S | 匹配非空白符 |
() | 匹配括号内的表达式,也表示一个组 |
[…] | 匹配字符组中的字符 |
[^…] | 匹配除了字符组中字符的所有字符 |
1.4 正则表达式之量词
1.4.1 结论
- 在正则表达式中所有的量词默认都是贪婪匹配(尽可能多的)
- 量词不能单独使用,必须跟在表达式的后面,并且只能影响紧挨着的左边那一个
1.4.2 量词
量词 | 用法说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
1.5 正则表达式实战
1.5.1 编写校验用户手机号的正则
0?(13|14|15|17|18|19)[0-9]{9}
1.5.2 编写校验用户身份证的正则
/d{17}[/d|x]|/d{15}
1.5.3 编写校验用户身份证的正则
/w[-/w.+]*@([A-Za-z0-9][-A-Za-z0-9]+/.)+[A-Za-z]{2,14}
1.5.4 编写校验用户qq号的正则
[1-9]([0-9]{5,11})
1.5.5 常见的正则百度查找
1.6 贪婪匹配与非贪婪匹配
1.6.1 贪婪匹配
待匹配的文本:<script>alert(123)</script>
正则表达式:<.*>
上述正则匹配出来的内容是:<script>alert(123)</script>
1.6.2 非贪婪匹配
待匹配的文本:<script>alert(123)</script>
正则表达式:<.*?>
上述正则匹配出来的内容是:<script> </script>
1.6.3 总结
- 所有的量词默认都是贪婪匹配,但是如果在量词的后面紧跟一个问号那么就会变成非贪婪匹配
- 所有的量词默认都是贪婪匹配,但是如果在量词的后面紧跟一个问号那么就会变成非贪婪匹配
1.7 取消转义
1.7.1 正则表达式中取消斜杠与字母的特殊含义,就是在斜杠前面加斜杠
//n /n
////n //n
1.7.2 在python中有更加简便的写法
r'/n'
r'//n'
2. 第三方模块
2.1 简介
2.1.1 使用
- 第三方模块必须先下载才可以导入使用
- python下载第三方模块需要借助于pip工具
2.1.2 下载命令
- 方式一
pip install 模块名
pip install 模块名==版本号
pin install 模块名install 模块名 -i 源地址 - 方式二
pycharm内在settings里下载
2.1.3 下载速度慢
pip工具默认是从外国的仓库地址下载模块,速度很慢
我们可以切换下载的地址(源地址)
清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/
华中科技大学:http://pypi.hustunique.com/
豆瓣源:http://pypi.douban.com/simple/
腾讯源:http://mirrors.cloud.tencent.com/pypi/simple
华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/
2.1.4 下载报错
- pip工具版本过低,直接拷贝提示信息里面的更新命令即可
- 网络波动,关键字是Read timed out,只需要重新下载几次即可,或者切换一个网络稳定一点的
- 有些模块在下载使用之前需要提前配置指定的环境,结合具体情况,可百度搜索
2.2 re 模块
2.2.1 了解
在python中如果想要使用正则表达式,re模块是选择之一
2.2.2 语法
两个参数,第一个是正则,第二个放待匹配的文本
2.2.3 findall
findall 通过正则表达式筛选出文本中所有符合条件的数据,返回结果是列表
import re
res = re.findall('a', 'jason abc aba')
print(res) # 返回所有满足匹配条件的结果,放在列表里 ['a','a','a','a']
2.2.4 finditer
finditer 与 findall 作用一致,只不过结果会被处理迭代器对象,用于节省内存,可以用for循环得出
res = re.finditer('a', 'jason abc aba')
print(res) # <callable_iterator object at 0x00000251D84C5C70>
for i in res:
print(i)
# <callable_iterator object at 0x00000251D84C5C70>
# <re.Match object; span=(1, 2), match='a'>
# <re.Match object; span=(6, 7), match='a'>
# <re.Match object; span=(10, 11), match='a'>
# <re.Match object; span=(12, 13), match='a'>
2.2.5 search
search通过正则表达式匹配到一个符号条件的内容就结束
res = re.search('a', 'jason abc aba')
print(res) # <re.Match object; span=(1, 2), match='a'>
2.2.6 match
match 通过正则表达式从头开始匹配,如果头部已经不符合,那么后面不走了
res = re.match('a', 'jason abc aba')
print(res) # None
2.2.7 compile
compile能够提前准备好正则,之后可以反复使用,减少代码冗余
obj = re.compile('a')
print(re.findall(obj,'afdafvdfqas')) # ['a', 'a', 'a']
print(re.findall(obj,'adsfeqwrgfd')) # ['a']
print(re.findall(obj,'bazfafgsdef')) # ['a', 'a']
2.2.8 分组
- findall针对分组的正则表达式匹配到的结果,优先展示
res = re.findall('abc','abcabcabcabc')
print(res) # ['abc', 'abc', 'abc', 'abc']
res1 = re.findall('a(b)c','abcabcabcabc')
print(res1) # ['b', 'b', 'b', 'b']
- findall也能够取消分组优先展示(?:)
res = re.findall('a(?:b)c','abcabcabcabc')
print(res) # ['abc', 'abc', 'abc', 'abc']
- group用法
res = re.search('a(b)c','abcabcabcabc')
print(res.group()) # abc
print(res.group(0)) # abc
print(res.group(1)) # b
2.2.9 别名
res = re.search('a(?P<id>b)(?P<name>c)','abcabcabcabc')
print(res.group()) # abc
print(res.group(1)) # b
print(res.group('id')) # b
print(res.group('name')) # c
2.3 openpyxl 模块
2.3.1 openpyxl模块简介
- 主要用于操作excel表格,也是pandas底层操作表格的模块
- 在python中能够操作excel表格的模块有很多,openpyxl属于近几年比较流行的模块,openpyxl针对03版本之前的excel文件兼容性不好 xlwt,xlrd也可以操作excel表格,兼容所有版本的excel文件 但是使用方式没有openpyxl简单
2.3.2 execl版本问题
- 03版本之前 excel文件的后缀名 .xls
- 03版本之后 excel文件的后缀名 .xlsx
- 如果是苹果电脑excel文件的后缀 .csv
2.3.3 openpyxl下载
pip3.8 install openpyxl
2.3.4 创建excel文件
from openpyxl import Workbook
wb = Workbook() # 创建excel文件
wb1 = wb.create_sheet('a表')
wb2 = wb.create_sheet('b表')
wb3 = wb.create_sheet('c表', 0) # 可以自己定义位置
wb.save(r'11.xlsx') # 保存文件
2.3.5 写入数据
# 第一种写入方式
wb3['A3'] = '写到A3'
wb3['C2'] = '写到C2'
wb.save(r'11.xlsx') # 保存文件
# 第二种写入方式
wb3.cell(row=4,column=5,value='数据3') # row 行 column 列 value 值
wb.save(r'11.xlsx') # 保存文件
# 第三种写入方式(批量写入)
wb3.append(['a','b','c','d'])
wb3.append(['jjj',11,22,'dddd'])
wb3.append(['jjj',11,22,'dddd'])
wb3.append(['jjj',11,22,'dddd'])
wb3.append(['jjj',11,22,'dddd'])
wb3.append([11,22,'dddd'])
wb3.append([None,11,22,'dddd'])
wb.save(r'11.xlsx') # 保存文件
2.3.6 查看
print(wb.sheetnames) # 查看execl文件中所有的工作簿名称
wb1 = wb['表单名']
print(wb1.max_row) # 列表有几行 5
print(wb1.max_column) # 列表有几列 4
2.3.7 取出数据
<code>print(wb1['A1'].value) # 第一种取值方式 指定取出取列表内容
print(wb1.cell(row=2,column =2 ).value) # 第二中取值方式 根据行列取值
for i in wb1.rows: # 第三种 循环取值 行
print([j.value for j in i])
for j in wb1.columns: # 第三种 循环取值 列
print([i.value for i in j])
wb.save(r'11.xlsx')</code></pre>
2.3.8 pandas
在openpyxl模块上加pandas模块,openpyxl不擅长读数据 所以有一些模块优化了读取的方式,pandas模块,一层层优化
import pandas
d = {
'公司名称': ['老男孩', '老女孩', '老伙计', '老北鼻'],
'公司地址': ['上海', '深圳', '杭州', '东京'],
'公司电话': [120, 130, 129, 996],
}
df = pandas.DataFrame(d)
df.to_excel(r'222.xlsx')
2.4 random 随机数模块
2.4.1 random.random
import random
# 返回0到1之间随机的小数,每次结果都不一样
print(random.random()) # 0.20312916730466013
2.4.2 random.randint
# 返回1到6之间随机的整数 如 掷骰子
print(random.randint(1, 6)) # 1
2.4.3 random.choice
# 随机抽取一个
print(random.choice(['a','b','c'])) # b
2.4.4 random.sample
# 随机抽样,自定义抽取个数
print(random.sample(['a','b','c','v','n','m'],4)) # ['v', 'c', 'b', 'a']
2.4.5 random.shuffle
# 打乱顺序,如扑克牌洗牌
l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A', '大王', '小王']
random.shuffle(l1)
print(l1) # ['A', 'K', '大王', 'Q', '小王', 5, 2, 7, 10, 3, 9, 'J', 6, 8, 4]
2.5 subprocess 模块
# 模拟计算机cmd命令窗口
import subprocess
cmd = input('请输入您的指令>>>:').strip()
cmd = input('请输入您的指令>>>:').strip()
sub = subprocess.Popen(cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
# stdout执行命令之后正确的返回结果
print(sub.stdout.read().decode('gbk'))
# stderr执行命令报错之后的返回结果
print(sub.stderr.read().decode('gbk'))
3. 网络爬虫简介
3.1 什么是互联网,目的,本质
- 互联网:将全世界的计算机连接到一起组成的网络
- 目的:将接人互联网的计算机上面的数据彼此共享
- 本质:基于互联网访问别人计算机上面的资源,有些计算机存在的意义就是让别人访问,这种类型的计算机我们也称之为服务器
3.2 网络爬虫本质
模拟计算机浏览器朝目标网址发送请求回去数据并筛选,只要是浏览器可以访问的数据网络爬虫理论都可以
3.3 实例
- 获取红牛分公司数据(第30回)
- 爬取链家二手房数据(第31回)
4. 加密模块
4.1 什么是加密,为什么,如何判断
加密:将明文数据(看得懂)经过处理之后变成密文数据(看不懂)的过程。不想让敏感的数据轻易的泄露,一般情况下如果是一串没有规则的数字字母符合的组合一般都是加密之后的结果
4.2 加密算法
- 就是对明文数据采用的加密策略
- 不同的加密算法复杂度不一样 得出的结果长短也不一样
- 通常情况下加密之后的结果越长 说明采用的加密算法越复杂
4.3 常见加密算法
md5 sha系列 hmac base64
4.4 代码实参
import hashlib
md5 = hashlib.md5() #选择md5加密算法作为数据的加密策略
md5.update(b'1234') # 往里面添加文明数据,数据必须是bytes类型
res = md5.hexdigest() # 获取加密之后的结果
print(res) # 81dc9bdb52d04dc20036dbd8313ed055
4.5 反解密
加密之后的结果一般情况下不能反解密,所谓的反解密很多时候其实是偷换概念,提前假设别人的密码是什么,然后用各种算法算出对应的密文,之后构造对应关系,然后比对密文,最终映射明文
4.6 理解
只要明文数据是一样的那么采用相同的算法得出的密文肯定一样
4.7 加盐处理(salt)
动态加盐:干扰项每次都不一样,目的是更让密码安全
eg:每次获取当前时间 每个用户用户名截取一段
# 加盐处理(salt)
# 加盐处理加一个干扰项,让密码被反解的概率更低
md5 = hashlib.md5()
password = input('password>>>:').strip()
md5.update('公司设置的盐(干扰项)'.encode('utf8'))
md5.update(password.encode('utf8'))
res = md5.hexdigest()
print(res) # a8ad1a472729b0e769defc39f2adfc17
4.8 加密实际应用场景
- 用户密码加密,注册存储密文,登录也是比对密文
- 文件安全性校验
正规的软件程序写完之后做一个内容的加密,网址提供软件文件记忆该文件内容对应的密文,用户下载完成后不直接运行 而是对下载的内容做加密,然后比对两次密文是否一致 如果一致表示文件没有被改, 不一致则表示改程序有可能被植入病毒 - 大文件加密优化
程序文件100G,一般情况下读取100G内容然后全部加密 太慢,不对100G所有的内容加密 而是截取一部分加密
eg:每隔500M读取30bytes
5. 日志模块
5.1 日志简介
5.1.1 什么是日志,为什么使用
日志就类似于是历史记录(日志模块需要你写的代码很少 几乎都是CV),为了记录事物发生的事实
5.1.2 日志等级
import logging
logging.debug('debug等级') # 10
logging.info('info等级') # 20
logging.warning('warning等级') # 默认从warning级别开始记录日志 30
logging.error('error等级') # 30
logging.critical('critical等级') # 40
5.1.3 基本使用
import logging
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8', )
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_handler, ],
level=logging.ERROR
)
logging.error('报错')
5.2 四个组成部分
日志模块组成部分主要分四个部分
- 日志的产生(准备原材料) logger对象
- 日志的过滤(剔除不良品) filter对象>>>:可以忽略 不用使用
- 日志的产出(成品) handler对象
- 日志的格式(包装) format对象
5.3 实战应用
- 按照软件开发目录规范编写使用
- 日志字典数据应该放在哪个py文件内,字典数据是日志模块固定的配置 写完一次之后几乎都不需要动,它属于配置文件,配置文件中变量名推荐全大写
- 软件开发目录规范中所有py文件的真正作用
def get_logger(msg):
# 记录日志
logging.config.dictConfig(settings.LOGGING_DIC) # 自动加载字典中的配置
logger1 = logging.getLogger(msg)
# logger1.debug(f'{username}注册成功') # 这里让用户自己写更好
return logger1
6. 三层架构
6.1 编写代码的改进历程
- 直接写在一个文件,采用面条版堆积
- 将有些具体的功能,采用函数封装
- 将不同的功能拆分到不同的文件
ps:拆分的目的是为了更好的管理资源和代码 提升程序的扩展性
6.2 项目架构
- 百度
以用户登录为例
1.浏览器页面获取用户名和密码
2.基于网络将用户名和密码发送给百度服务端
3.服务端去数据库中校验用户数据
三层架构
浏览器、服务端、数据库
2. 淘宝
以购买商品为例
1.浏览器页面展示商品总价
2.基于网络将购买商品的操作发送给服务端做核心校验
3.之后操作相应数据库完成数据修改
三层架构
浏览器、服务端、数据库
6.3 三层架构
用户层
数据展示 数据获取
cmd窗口可以充当用户层
将来可以替换成浏览器或者app
核心逻辑层
业务逻辑
某个py文件充当逻辑层
将来可以替换成软件开发目录规范或者现成的框架
数据层
数据的增删改查
json文件充当数据库
将来可以替换成数据库程序
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/python/276734.html