本周内容总结
正则表达式
字符组
'''字符组的匹配顺序默认是从前到后'''
[0,1,2,3,4,5,6,7,8,9] # 从0到9
简写:
[0-9]
[a-z]
[0-9a-z] # 字符组自带或关系
特殊符号
'''特殊符号也是挨个匹配的'''
. 除换行符以外的符号
\w 匹配字母 数字 下划线(变量名)
\W 和上面正好相反
\d 匹配数字
^ 匹配开头
$ 匹配结尾
#补充:当^a$连用 就是匹配指定内容
a|b 匹配a或b
() 分组功能 不会影响匹配
[] 字符组 内部默认或的关系
[^] 匹配除括号的 取反
量词
'''正则表达式默认都是贪婪匹配 能多拿绝不少拿'''
* 一次或者无数次
+ 一次或者多次
? 匹配零次或者一次
{n} 重复n次
{n,} 重复n+次
{n,m} 重复n到m次
#量词需要结合表达式一起使用 不可单独出现 并且只影响左边第一个表达式
贪婪匹配与非贪婪匹配
使用符号?就可以把贪婪变成非贪婪匹配
转义符
'''斜杠和特殊字母会发生特殊含义'''
转义符的使用
在前面再加一个斜杆取消前面一个斜杠的意思
\\n
假设要获取\\n
则是\\\\n
再python中使用r''就可以直接转义
正则表达式实战运用
1.校验身份证的输入是否正确
2.编写邮箱正则
3.编写校验手机号的正则
# 正则多数用户校验 但网上有别人写好了的
re模块
re模块的使用
#在python中使用re模块
import re
'''
常见的操作
res = re.findall('a','jason apple aaa')
print(res) 查找符合要求的字符组 返回的结果是一个列表
res = re.finditer('a','jason apple aaa')
print(res) 也是查找符合结果的字符组 但返回的是一个迭代器对象
res = re.search('a','jason apple aaa')
print(res) 所打印的结果不可读
print(res.group()) 匹配到第一个符合条件的就结束
res = re.match('a','jason apple aaa')
print(res) None
print(res.group()) 如果开头不满足也就不会有后后续了
'''
#当我们需要频繁使用可以将其组成模板
obj = re.compile('\d{3}')
res1 = obj.findall('ssadsadad')
res2 = obj.findall('sahdsja')
print(res1,res2)
就可以直接使用
#分割操作
res = re.split('[a,b]','abcd')
先按照a进行切割 结果是:['','bcd']
再按照b进行切割 ['','','cd']
#代替操作
res = re.sub('\d','h','snajdsn2s332',1) # 将数字替换成h 替换的数量为1个
如果没有添加次数参数 返回的则是一个元组
格式:('替换后的格式',被替换的数量)
re模块的补充说明
1.分组优先
在写正则的时候使用小括号 就会优先展示小括号的内容(分组优先)
可以使用?取消掉分组优先展示
2.起别名
可以给分组的内容加上别名(?P<别名>)
在后续可以直接使用别名获取内容
如何下载和使用第三方模块
#第三方模块
别人写好的模块 提供下载使用(python强大的地方)
#下载第三方模块的注意事项
pip工具
每一个解释器版本都会附带一个pip工具 下载模块的时候需要注意在下载模块时是哪一个版本
下载模块的语句
pip install 模块名
下载时切换临时仓库
pip install 模块名 -i 仓库名
下载模块指定版本(默认最新版)
pip install 模块名==版本 -i 仓库名
#在pycharm里提供了快捷方式
在下载模块时可能出现的问题以及解决思路
#1.报错并附带警告信息
WARNING: You are using pip version 20.2.1
提示当前版本过低 需要更新只需点击所提供的指令就可以自动更新
#2.报错出现timeout关键字
提示网络波动大 不稳定
换个网 多试几次就好了
#3.报错没有出现关键字
直接面向百度搜索
一般都是该模块需要提前准备一些东西才可以
#4.下载速度太慢
pip默认的下载地址都是在外国
可以手动切换下载的地址
pip install 模块名 -i 仓库地址
eg:
清华大学 :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/
'''补充:更换下载地址并没有实质性的区别 只是为了提高下载的速度'''
网络爬虫
requests模块
requests模块 可以模拟操作系统发送请求
import requests
朝着指定的网址发送请求获取页面数据
代码实现:
res = requests(网址名)
print(res.content)
res.encoding = 'utf8'
print(res.txt)
爬取链接二手房数据(实战)
import requests
import re
res = requests.get('https://sh.lianjia.com/ershoufang/pudong/')
deta = res.text
home_title_list = re.findall(
'<a class="" href=".*?" target="_blank" data-log_index=".*?" data-el="ershoufang" data-housecode=".*?" data-is_focus="" data-sl="">(.*?)</a>',
data)
#利用正则表达式来获取我们想要的内容
print(home_title_list)
自动化办公领域之openpyxl模块
1.excel文件后缀问题
03版本之前 .xls
02版本之前 .xlsx
2.操作excel表格的第三方模块
xlwt往表格中写入数据,wlrd从表格中读取数据
兼容性所有版本的excel文件
#详细:https://www.cnblogs.com/xiaochenxiangchangpang/p/16829568.html
hashlib加密模块
使用
1.加密
将明文变成密文 使人无法直接看懂
2.加密的含义
对数据的保护
3.如何判断数据是否进行加密
一串没有规律的字符串
4.密文的长短讲究
密文越长表示使用的加密算法越复杂
5.常见的加密的方式
md5 base64 hmac sha系类
6.加密算法的基本操作
import hashlib
1.选择加密方式
2.输入需要加密的明文数据
3.获取加密密文
补充说明
1.加密的密文无法被反向破解
2.加密的方式一样 得到的密文长度是固定的
3.加盐处理 在明文中加入固定的干扰项
4.动态加盐 使用动态的变量来代替固定的干扰项
5.加密的运用场景
1.加密用户的密码
2.文件安全性的校验
3.文件内容的校验
4.文件内容加密 截取式加密
subprocess模块
模拟操作系统的终端 执行命令并获取结果
import subprocess
res = subprocess.Popen(
'asdsdsa' #需要进行操作的命令
shell = True # 固定配置
stdin = subprocess.PIPE #固定命名
stdout = subprocess.PIPE #输出结果
)
print('正确结果',res.stdout.read().decode('gbk')) # 获取操作系统执行命名后的正确结果
print('错误结果',res.stderr) # 获取操作系统执行命名后的错误结果
logging日志模块
1.日志的作用
记录操作记录和行为举止
2.日志的级别
日志的级别分五种
3.日志的模块
import logging
# logging.debug('debug message')
# logging.info('info message')
# logging.warning('warning message')
# logging.error('error message')
# logging.critical('critical message')
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf8',)
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('你好')
日志的组成
'''
1.日志的产生
2.过滤日志
3.输出日志
4.日志的格式
'''
import logging
#1.日志的产生 #logger对象
logger = logging.getLogger('购物车记录')
#2.日志的过滤(基本不用) filter对象>>>:可以忽略
#3.日志的产出(成品) handler对象
hd1 = logging.FileHandler('a1.log', encoding='utf-8') # 输出到文件中
hd2 = logging.FileHandler('a2.log', encoding='utf-8') # 输出到文件中
hd3 = logging.StreamHandler() # 输出到终端
#4.日志的格式(包装) format对象
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绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
#7.设置日志的等级
logger.setLevel(10) # debug
#8.记录日志
logger.debug('111')
日志的配置字典
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('11 22 33')
标签:logging,res,re,w5,模块,print,日志
From: https://www.cnblogs.com/xiaochenxiangchangpang/p/16841424.html