正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
该知识点不属于任何一门编程语言,是一个独立的学科,主要用于数据的查找与筛选
正则表达式本质上就是使用一些符号的组合产生一些特殊的含义,然后去字符串中筛选出符合条件的数据
正则表达式线上测试网址:http://tool.chinaz.com/regex/
字符组在没有量词修饰的情况一次只会针对一个数据值
匹配0到9之间的任意一个数字(包括0和9)全称是:[0123456789]
匹配A到Z之间的任意一个字母(包括A和Z)全称是:[ABC...XYZ]
匹配a到z之间的任意一个字母(包括a和z)全称是:[abc...xyz]
在中括号内编写的多个数据值彼此都是或的关系, 数字,小写字母,大写字母都可以
特殊符号在没有量词修饰的情况一个符号一次只会针对一个数据值
元字符 | 匹配内容 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\b | 匹配一个单词的结尾 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
\W | 匹配非字母或数字或下划线 |
\D | 匹配非数字 |
\S | 匹配非空白符 |
() | 匹配括号内的表达式,也表示一个组 |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中字符的所有字符 |
量词 | 用法说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
0?(13|14|15|17|18|19)[0-9]{9}
\d{17}[\d|x]|\d{15}
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
[1-9]([0-9]{5,11})
待匹配的文本:<script>alert(123)</script> 正则表达式:<.*> 上述正则匹配出来的内容是:<script>alert(123)</script>
待匹配的文本:<script>alert(123)</script> 正则表达式:<.*?> 上述正则匹配出来的内容是:<script> </script>
\\n \n \\\\n \\n
r'\n' r'\\n'
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/
在python中如果想要使用正则表达式,re模块是选择之一
两个参数,第一个是正则,第二个放待匹配的文本
findall 通过正则表达式筛选出文本中所有符合条件的数据,返回结果是列表
import re res = re.findall('a', 'jason abc aba') print(res) # 返回所有满足匹配条件的结果,放在列表里 ['a','a','a','a']
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'>
search通过正则表达式匹配到一个符号条件的内容就结束
res = re.search('a', 'jason abc aba') print(res) # <re.Match object; span=(1, 2), match='a'>
match 通过正则表达式从头开始匹配,如果头部已经不符合,那么后面不走了
res = re.match('a', 'jason abc aba') print(res) # None
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']
res = re.findall('abc','abcabcabcabc') print(res) # ['abc', 'abc', 'abc', 'abc'] res1 = re.findall('a(b)c','abcabcabcabc') print(res1) # ['b', 'b', 'b', 'b']
res = re.findall('a(?:b)c','abcabcabcabc') print(res) # ['abc', 'abc', 'abc', 'abc']
res = re.search('a(b)c','abcabcabcabc') print(res.group()) # abc print(res.group(0)) # abc print(res.group(1)) # b
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
pip3.8 install openpyxl
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') # 保存文件
# 第一种写入方式 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') # 保存文件
print(wb.sheetnames) # 查看execl文件中所有的工作簿名称 wb1 = wb['表单名'] print(wb1.max_row) # 列表有几行 5 print(wb1.max_column) # 列表有几列 4
<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>
在openpyxl模块上加pandas模块,openpyxl不擅长读数据 所以有一些模块优化了读取的方式,pandas模块,一层层优化
import pandas d = { '公司名称': ['老男孩', '老女孩', '老伙计', '老北鼻'], '公司地址': ['上海', '深圳', '杭州', '东京'], '公司电话': [120, 130, 129, 996], } df = pandas.DataFrame(d) df.to_excel(r'222.xlsx')
import random # 返回0到1之间随机的小数,每次结果都不一样 print(random.random()) # 0.20312916730466013
# 返回1到6之间随机的整数 如 掷骰子 print(random.randint(1, 6)) # 1
# 随机抽取一个 print(random.choice(['a','b','c'])) # b
# 随机抽样,自定义抽取个数 print(random.sample(['a','b','c','v','n','m'],4)) # ['v', 'c', 'b', 'a']
# 打乱顺序,如扑克牌洗牌 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]
# 模拟计算机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'))
模拟计算机浏览器朝目标网址发送请求回去数据并筛选,只要是浏览器可以访问的数据网络爬虫理论都可以
加密:将明文数据(看得懂)经过处理之后变成密文数据(看不懂)的过程。不想让敏感的数据轻易的泄露,一般情况下如果是一串没有规则的数字字母符合的组合一般都是加密之后的结果
md5 sha系列 hmac base64
import hashlib md5 = hashlib.md5() #选择md5加密算法作为数据的加密策略 md5.update(b'1234') # 往里面添加文明数据,数据必须是bytes类型 res = md5.hexdigest() # 获取加密之后的结果 print(res) # 81dc9bdb52d04dc20036dbd8313ed055
加密之后的结果一般情况下不能反解密,所谓的反解密很多时候其实是偷换概念,提前假设别人的密码是什么,然后用各种算法算出对应的密文,之后构造对应关系,然后比对密文,最终映射明文
只要明文数据是一样的那么采用相同的算法得出的密文肯定一样
动态加盐:干扰项每次都不一样,目的是更让密码安全
eg:每次获取当前时间 每个用户用户名截取一段
# 加盐处理(salt) # 加盐处理加一个干扰项,让密码被反解的概率更低 md5 = hashlib.md5() password = input('password>>>:').strip() md5.update('公司设置的盐(干扰项)'.encode('utf8')) md5.update(password.encode('utf8')) res = md5.hexdigest() print(res) # a8ad1a472729b0e769defc39f2adfc17
日志就类似于是历史记录(日志模块需要你写的代码很少 几乎都是CV),为了记录事物发生的事实
import logging logging.debug('debug等级') # 10 logging.info('info等级') # 20 logging.warning('warning等级') # 默认从warning级别开始记录日志 30 logging.error('error等级') # 30 logging.critical('critical等级') # 40
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('报错')
日志模块组成部分主要分四个部分
def get_logger(msg): # 记录日志 logging.config.dictConfig(settings.LOGGING_DIC) # 自动加载字典中的配置 logger1 = logging.getLogger(msg) # logger1.debug(f'{username}注册成功') # 这里让用户自己写更好 return logger1
以用户登录为例 1.浏览器页面获取用户名和密码 2.基于网络将用户名和密码发送给百度服务端 3.服务端去数据库中校验用户数据 三层架构 浏览器、服务端、数据库
2. 淘宝
以购买商品为例 1.浏览器页面展示商品总价 2.基于网络将购买商品的操作发送给服务端做核心校验 3.之后操作相应数据库完成数据修改 三层架构 浏览器、服务端、数据库
用户层 数据展示 数据获取 cmd窗口可以充当用户层 将来可以替换成浏览器或者app 核心逻辑层 业务逻辑 某个py文件充当逻辑层 将来可以替换成软件开发目录规范或者现成的框架 数据层 数据的增删改查 json文件充当数据库 将来可以替换成数据库程序