一 hashlib - 加密模块
1 hashlib.md5 加密
- 简介:MD5加密(信息-摘要算法)在Python3中使用Hashlib模块进行操作,关于该算法的原理,我们可以简单的理解为:通过一个函数,把任意长度的数据转换为一个长度固定的数据串。
- 加密方式:通常用16进制的字符串表示
- 性质:
- 不可逆性:MD5加密是一种散列函数(哈希函数),他是一个单向密码体制,即从明文到密文的不可逆映射,只有加密过程没有解密过程。
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
- 抗碰撞性:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
代码示例:
""" test """
import hashlib
# 明文密码
password = "jhf2345"
# 确定加密算法类型
encryption_md5 = hashlib.md5()
# 将明文数据传递给md5算法
encryption_md5.update(password.encode("utf-8"))
# 获取加密之后的密文数据
enc_password = encryption_md5.hexdigest()
print(enc_password)
### 打印内容如下 ###
"""
b3b06668657b624feba85e259c49958a
"""
2 hashlib.sha1加密
简介:sha1算法是基于MD5的一种加密算法,加密后的数据长度会比MD5更长,但是效率也会变的更慢。
代码示例:
""" test """
import hashlib
# 明文密码
password = "jhf2345"
# 确定加密算法类型
encryption_sha1 = hashlib.sha1()
# 将明文数据传递给md5算法
encryption_sha1.update(password.encode("utf-8"))
# 获取加密之后的密文数据
enc_password = encryption_sha1.hexdigest()
print(enc_password)
### 打印内容如下 ###
"""
b0e1736725d14d38165d48fddabd8f76a1c95bb3
"""
二 logging - 日志模块
1 logging.basicConfig()的使用
""" test """
import logging
# 日志有五个等级,默认级别>=30
# logging.debug("debug级别日志!") # 10
# logging.info("info级别日志!") # 20
# logging.warning("warning级别日志!") # 30
# logging.error("error级别日志!") # 40
# logging.critical("critical级别日志!") # 50
file_handler = logging.FileHandler(
filename="x1.log",
mode="w",
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.INFO
)
logging.debug("debug级别日志!")
logging.info("info级别日志!")
logging.warning("warning级别日志!")
logging.error("error级别日志!")
logging.critical("critical级别日志!")
### 打印内容如下 ###
"""
[2023-08-21 19:24:26 PM - root - INFO - test_yyy] info级别日志!
[2023-08-21 19:24:26 PM - root - WARNING - test_yyy] warning级别日志!
[2023-08-21 19:24:26 PM - root - ERROR - test_yyy] error级别日志!
[2023-08-21 19:24:26 PM - root - CRITICAL - test_yyy] critical级别日志!
"""
2 logging.getLogger()的使用
""" test """
import logging
# 日志有五个等级,默认级别>=30
# logging.debug("debug级别日志!") # 10
# logging.info("info级别日志!") # 20
# logging.warning("warning级别日志!") # 30
# logging.error("error级别日志!") # 40
# logging.critical("critical级别日志!") # 50
# file_handler = logging.StreamHandler() # 日志打印在终端
file_handler = logging.FileHandler(
filename="x1.log",
mode="w",
encoding="utf-8"
)
fmt = logging.Formatter(
fmt='[%(asctime)s - (%(name)s) - %(levelname)s - %(module)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
# datefmt='%Y-%m-%d %H:%M:%S %p'
)
file_handler.setFormatter(fmt)
logger = logging.getLogger("学习记录!")
logger.addHandler(file_handler)
logger.setLevel(20)
logger.debug("debug级别日志!")
logger.info("info级别日志!")
logger.warning("warning级别日志!")
logger.error("error级别日志!")
logger.critical("critical级别日志!")
### 打印内容如下 ###
"""
[2023-08-21 19:31:13 - (学习记录!) - INFO - test_yyy] info级别日志!
[2023-08-21 19:31:13 - (学习记录!) - WARNING - test_yyy] warning级别日志!
[2023-08-21 19:31:13 - (学习记录!) - ERROR - test_yyy] error级别日志!
[2023-08-21 19:31:13 - (学习记录!) - CRITICAL - test_yyy] critical级别日志!
"""
三 random - 随机模块
"""random使用情况"""
import random
# 随机生成的一个浮点数,范围在[0, 1)之间
random.random()
# 随机生成的一个浮点数,范围在[a, b]之间
random.uniform(1, 5)
# 随机生成的一个整数,范围在[a, b]之间
random.randint(1, 5)
# 随机生成的一个整数,范围在[a, b)之间,注意步长
random.randrange(1, 5, 2)
# 从指定的序列中(列表,元组,字符串),随机取出一个元素
seq = [1, 2, 3, 4]
random.choice(seq)
# 将一个列表中的元素打乱,随机排序
seq = [1, 2, 3, 4]
random.shuffle(seq) # [1, 4, 2, 3]
四 re - 正则模块
1 字符含义
字符 | 描述 | 备注 |
---|---|---|
. | 匹配除换行符 \n 之外的任何单字符 | |
+ | 匹配前面的子表达式一次或多次 | |
* | 匹配前面的子表达式零次或多次 | |
? | 匹配前面的子表达式零次或一次 | |
^ | 匹配输入字符串的开始位置 | |
$ | 匹配输入字符串的结束位置 | |
\d | 匹配一个数字字符 | 等价于 [0-9] |
\w | 匹配一个字母或者一个数字或者下划线 | 等价于 [A-Za-z0-9_] |
\s | 匹配一个空格或者Tab键 | 等价于 [ \f\n\r\t\v] |
{m}、{m, n} | 某个字符匹配m次/m-n次 | |
() | 标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用 | |
| | “或"操作,若要匹配"mood"或"food”,请使用括号创建子表达式,从而产生"(m|f)ood" |
2 匹配函数
2-1 re.match函数
从字符串的起始位置匹配;若匹配成功,则返回一个Match对象,否则,返回None
""" test """
import re
text = "abcdefg1234567"
result = re.match(r"abc", text)
print(result)
### 打印内容 ###
"""
<re.Match object; span=(0, 3), match='abc'>
"""
2-2 re.search函数
扫描整个字符串并返回第一个成功的匹配;若匹配成功,则返回一个Match对象,否则,返回None
""" test """
import re
text = "abcdefg1234567g12"
result = re.search(r"g12", text)
print(result)
### 打印内容 ###
"""
<re.Match object; span=(6, 9), match='g12'>
"""
2-3 re.findall函数
在字符串中找到正则表达式所匹配的所有子串;若匹配成功,则返回一个列表,否则,返回空列表
""" test """
import re
text = "abcdefg1234567g12"
result = re.findall(r"\d+", text)
print(result)
### 打印内容 ###
"""
['1234567', '12']
"""
2-4 re.finditer函数
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
""" test """
import re
text = "abcdefg1234567g12"
result = re.finditer(r"\d+", text)
print(result)
for res in result:
print(res)
### 打印内容 ###
"""
<callable_iterator object at 0x000001D7337F2F10>
<re.Match object; span=(7, 14), match='1234567'>
<re.Match object; span=(15, 17), match='12'>
"""
3 替换函数
3-1 re.sub函数
替换字符串中的匹配项
""" test """
import re
text = "abcdefg1234567g12"
result = re.sub(r"\d+", "xyz", text)
print(result)
### 打印内容 ###
"""
abcdefgxyzgxyz
"""
4 正则表达式生成函数
4-1 re.compile函数
编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() / search() / findall() / finditer() 函数使用。
""" test """
import re
text = "abcdefg1234567g12abc"
pattern = re.compile(r"abc")
print(pattern)
# 正则表达式"Pattern"对象的用法
match_result = pattern.match(text)
print(match_result)
search_result = pattern.search(text)
print(search_result)
findall_result = pattern.findall(text)
print(findall_result)
finditer_result = pattern.finditer(text)
print(finditer_result)
### 打印内容 ###
"""
re.compile('abc')
<re.Match object; span=(0, 3), match='abc'>
<re.Match object; span=(0, 3), match='abc'>
['abc', 'abc']
<callable_iterator object at 0x00000234BB382820>
"""
4-2 group()的用法
用于获取Match对象的内容
""" test """
import re
text = "abcdefg1234567g12abc"
pattern = re.compile(r"(abc).*(g12)3")
print(pattern)
result = pattern.search(text)
print(result)
print(result.group()) # 返回正则匹配的所有内容
print(result.group(1)) # 返回正则匹配的第一个括号内的内容
print(result.group(2)) # 返回正则匹配的第二个括号内的内容
### 打印内容 ###
"""
re.compile('(abc).*(g12)3')
<re.Match object; span=(0, 10), match='abcdefg123'>
abcdefg123
abc
g12
"""
5 正则表达式的断言
5-1 正向先行断言
表达式:xyz(?=pattern)
""" test """
import re
text = "123abc456abc789"
result = re.finditer(r'abc(?=456)', text)
print(result)
for res in result:
print(res)
### 打印内容 ###
"""
<callable_iterator object at 0x000001FFA7DD2F10>
<re.Match object; span=(3, 6), match='abc'>
"""
5-2 负向先行断言
表达式:xyz(?!pattern)
""" test """
import re
text = "123abc456abc789"
result = re.finditer(r'abc(?!456)', text)
print(result)
for res in result:
print(res)
### 打印内容 ###
"""
<callable_iterator object at 0x000001C8CD1A2F10>
<re.Match object; span=(9, 12), match='abc'>
"""
5-3 正向后行断言
表达式:(?<=pattern)xyz
""" test """
import re
text = "123abc456abc789"
result = re.finditer(r'(?<=123)abc', text)
print(result)
for res in result:
print(res)
### 打印内容 ###
"""
<callable_iterator object at 0x00000132C6272F10>
<re.Match object; span=(3, 6), match='abc'>
"""
5-4 负向后行断言
表达式:(?<!pattern)xyz
""" test """
import re
text = "123abc456abc789"
result = re.finditer(r'(?<!123)abc', text)
print(result)
for res in result:
print(res)
### 打印内容 ###
"""
<callable_iterator object at 0x00000232AD7F2F10>
<re.Match object; span=(9, 12), match='abc'>
"""