周总结(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('')  # 可以更换日志等级
posted @ 2022-10-30 19:46  李阿鸡  阅读(16)  评论(0编辑  收藏  举报
Title