周总结(5)
正则表达式
正则表达式主要用在校验手机号,身份证,爬虫方向
"""
正则表达式是一门独立的语言,用来匹配、校验、筛查、所需要的数据,
任何编程语言都可以使用正则,在python中直接使用内置模块re
"""
正则表达式之字符组
"字符组默认匹配方式是一个一个匹配,所有数据都是 或 的关系"
[0-9] 匹配0到9任意一个数字
[a-z] 匹配26个小写英文字母
[A-Z] 匹配26个大写英文字母
[0-9a-zA-Z] 匹配任意一个数字或大小写字母
特殊符号
"特殊符号默认匹配方式是一个一个匹配"
. 匹配除了换行符外所有字符
\w 匹配数字,字母,下划线
\W 匹配非数字,非字母,非下划线
\d 匹配数字
^ 匹配字符串开头
$ 匹配字符串结尾
a|b 匹配a或者b
() 给正则表达式分组
[] 匹配字符组里的组字符
[^] 匹配除了字符组里其他的所有字符
量词
"量词必须跟着表达式后面,不能单独使用,目的是为了增加字符匹配数量"
正则表达式默认都是贪婪匹配
* 匹配0次和多次, 默认多次
+ 匹配一次或多次, 默认多次
? 匹配零次或一次,用于非贪婪匹配
{n} 重复匹配N次
{n,} 重复匹配N次到更多次,默认是多次
{n,m} 重复N次到M次 , 默认是M次
贪婪匹配与非贪婪匹配
贪婪匹配一般使用 <.*> 的正则 来匹配,直到匹配到右侧最后一个>结束。<>可以看出开始和结束条件。
非贪婪匹配 <.*?> 贪婪匹配加上量词?就可以使其变成 非贪婪模式。根据开始和结束条件匹配到第一个结束条件中止。 开始下次匹配直到匹配完待匹配的数值。
取消转义符
我们遇到一些含有特殊含义的,如换行符\n 我们可以在前 加上\来取消特殊含义,取消完成后匹配的则是文本\n 。如果特殊含义的字符含有多个\\,那么含有多少我们就要加多少个 取消转义符\
re模块
python中是无法直接使用正则表达式的。需要借助re模块来使用,也可以借助第三方的其他模块。
常见操作方法
re.findall('查找的字符','待查找的文本')
结果是一个列表。查找所有符号正则表达式的字符。
re.finditer('查找的字符','待查找的文本')
结果是一个迭代器对象,查找所有符合真正表达式的字符。
re.search('查找的字符','待查找的文本')
匹配到一个符合条件的字符就立刻接受
re.match('查找的字符','待查找的文本')
匹配字符串的开头,如果不是直接结束
----------------------------------------------
obj = compile('正则表达式')
使用compile提前定义好正则表达式后期可以反复使用
res = obj.findall('待查找的字符串')
设置需要匹配的字符串
----------------------------------------------
re.split('分割条件','待分割的字符串')
更换
re.sub('匹配条件正则表达式','更换的字符','含有匹配条件的字符串')
re.subn 将字符串内的被更换的符合正则表达式的字符 换成更换的字符,并返回更换了几次
分组优先与分组别名
re.findall('(被分组的正则表达式)','待查找的数据')
使用'()' 进行分组,会优先展示符号分组内正则表达式的数据。'(?:正则表达式)取消优先展示'
分组别名
'(?P<名字>正则表达式)' 可以给分组起别名,可以使用多次起别名。
使用 关键字 search
re.search((?P<名字>正则表达式))
res.group() 来获取所有值
res.group('名字') 来获取该名字的正则表达式匹配的值
第三方模块的下载与使用
下载方法与使用句式
两种方式:
1.pip工具
电脑内含有多个python版本,那么每个版本安装包内Scripts文件夹下都有pip程序,我们使用的时候应该给他进行重复名对应每个python的版本
我们在使用的时候"""要清楚的知道我们使用的版本寻找对应的pip版本"""
----------------------------------------------
cmd命令里下载模块的句式:
pip install 模块名
切换下载源:
pip install 模块名 -i 下载源地址
指定模块版本:
pip install 模块名==版本号 -i 源地址
----------------------------------------------
2.pycharm自带的方法
打开file --- 打开settings --- 选择 project:文件名 --- 点击 python Interpreter ---- 双击模块名或点击+号 --- 输入模块名搜索 点击下方的install Package下载 -- 下载右侧的Manage Repositories 可以设置下载仓库,展示在模块名后方 --- 界面右下方的Specify version 可以选择模块版本号
pip下载方式报错处理方法
报错并有警告信息
1.含有WARNING # 原因在于pip版本过低,执行该报错信息后面的代码更新解决问题
2.含有Timeout # 网络问题,更换网络或重复多次执行。
3.没有关键字 # 百度搜索报错后面的报错信息处理。一般都是需要先下载一些文件
4.下载速度过慢 # 因默认下载源是国外的,更换下载源即可
"""下载源有很多百度搜"""
requests模块(网络爬虫)
该模块主要用于网络爬虫,配合re模块和正则表达式使用,模拟浏览器发送网络请求获取页面数据
res = requests.get('网页')
res.content # 获取二进制的网页数据
可以将二进制数据转换成指定编码数据
res.encoding = 'utf8'
res.text # 获取指定编码的网页数据
openpyxl模块(自动化办公领域)
帮助我们将数据存放入excel表格内
表格有两种后缀名
03 版本之前:.xls #兼容性差
03 版本之后:.xlsx
可以操作表格的模块
xlwt 往表格内写入数据
wlrd 从表格中读取数据
# 兼容所有版本
openpyxl 操作:
# 查看官方说明文档操作
from openpyxl import Workbook
Workbook # 创建excel文件
wb = Workbook() # wb 接收文件
创建工作簿名
w1 = wb.create_sheet('名字1')
w2 = wb.create_sheet('名字2')
修改工作簿位置
w3 = wb.create_sheet('名字1',0)
# 名字1放在首位
修改工作簿名
w2.title = '名字3'
# 名字2 修改成名字3
添加内容方法:
'我们往上面定义的w1的工作簿 名字1 里添加内容'
w1.cell(row = 1,column = 2, value = '添加的值') # row 行, column 列
可以 添加数学公式:
w1.cell(row = 1,column = 2, value = '数学公式')
根据excel 文件的行列添加数据:
w1['A1'] = 123
也可以增加数学公式:
w1['A2'] = '数学公式'
append方法写数据
# 先添加表头
w1.append(['姓名','手机号'])
# 根据表头位置添加数据
w1.append(['tank','110']) # 使用多个w1.append方法增加多行
保存文件
wb.save(r'文件名.xlsx') # wb 创建文件接收文件的变量名
"""这个模块主要用于写入数据,表单操作不是很擅长,可以使用更高级的模块 pandas ,excel文件可以操作最大值只有10W条,一旦超过,软件操作无效需要使用pandas模块"""
import pandas
改变成pandas内的DataFrame数据格式:
d2 = pandas.DataFrame(文件名或数据)
保存成excel:
d2.to_excel(r'文件名.xlsx')
hashlib模块(加密)
主要用于 为了保证安全把重要数据(eg:密码)转换成密文。
密文的特征:
一串没有规律的字符串。 由数字,字母,符号组成。
密文越长使用的加密算法越复杂。
常见的加密算法:
md5 , base64, hmac, sha系列
加密算法的基本操作
import hashlib
md5 = hashlib.md5() # 选择加密算法
md5.upadte(b'字符串或数字') # 将明文数据传递给算法。如果字符串是纯数字或英文则需在前方加b 转换成bytes类型
res = md5.hexdigest() # 获取加密后的密文
print(res)
传入数据一致时,算法加密结果是一样的(分段传入)
md5 = hashlib.md5()
md5.update(b'he')
md5.update(b'llo')
res = md5.hexdigest()
print(res)
# 得到的结果是hello的密文
"""加密结果无法进行反解密,一般的解密都是提前定义好无数种 明文组合的密文,再去比对"""
加盐与动态加盐
1. 加盐处理
md5 = hashlib.md5()
md5.update('我设置的干扰项'.encode('utf8')) # 字符串需提前转格式
md5.update(b'1b1')
res = md5.hexdigest()
print(res)
"""在我们真实需要加密的明文前加上干扰项可以增加破解难度"""
2.动态加盐(用来动态变化干扰)
可以是用户名的一部分,也可以是当时时间
"需要提前导入 time 模块"
md5 = hashlib.md5()
md5.update(time.strftime('%Y年%m月%d日%H时%M分%S秒').encode('utf8'))
md5.update(b'1b1')
res = md5.hexdigest()
print(res)
应用场景
密码加密比对
"""根据用户输入的密码用相同算法加密成密文,和数据库里的密文做比对 """
文件内容一致性校验
"""我们在下载文件时,文件的厂商会给该内容做加密,并在用户下载的时候一同传给用户,下载完成后则会对内容做相同的加密与厂商传的密文做对比,如果一致则该文件没被篡改过,是安全的"""
subprocess模块
该模块可以实现远程操作其他计算机的功能
mport subprocess
res = subprocess.Popen(
'dir', # 操作系统要执行的命令
shell=True, # 固定配置
stdin=subprocess.PIPE, # 输入命令
stdout=subprocess.PIPE, # 输出结果
)
print('正确结果', res.stdout.read().decode('gbk')) # 获取操作系统执行命令之后的正确结果
print('错误结果', res.stderr) # 获取操作系统执行命令之后的错误结果
loging日志模块
用于记录用户的操作,以文本保存下来。方便后期查询
五个等级:
debug # 大小事全记录
info # 记录日常的事
warning # 记录可能会发生的警告
error # 记录发生的错误
critical #记录程序奔溃记录
组成部分:
logger 产生日志
filter 过滤日志 # 基本不用,可以再日志产生阶段控制想要的日志内容
handler 输出日志 # 可以控制传输到文件或终端,也可以同时输出
format 日志格式
日志字典(需要使用的时候拷贝)
import logging
import logging.config
# 定义日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' # 其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
# 自定义文件路径
logfile_path = 'a3.log'
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # 过滤日志
'handlers': {
# 打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
# 打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
# logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
# '购物车记录': {
# 'handlers': ['default','console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
# 'level': 'WARNING',
# 'propagate': True, # 向上(更高level的logger)传递
# }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
}
logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
# logger1 = logging.getLogger('购物车记录')
# logger1.warning('尊敬的VIP客户 晚上好 您又来啦')
# logger1 = logging.getLogger('注册记录')
# logger1.debug('jason注册成功')
logger1 = logging.getLogger('红浪漫顾客消费记录')
logger1.debug('慢男 猛男 骚男')
常用操作方法:
logging.config.dictCofig(LOGGING_DIC) # 加载日志字典
logger1 = logging.getLogger('消费记录') # 根据自己需求比如说, 登录记录
logger1.debug('') # 可以更换日志等级