[re模块、json&pickle模块]
[re模块、json&pickle模块]
re模块
什么是正则?
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
注意:re模块不是内置的,是属于标准库的,创建模块不要与标准库模块名重名,容易发生冲突
常用匹配模式(元字符)

常用匹配模式的具体用法:
improt re
print(re.findall("abc","abcxxaabcxabcyyyabc"))
# abcxxaabcxabcyyyabc
# abc-->abc-abc-->abc # 依次匹配,吃掉属于它的范畴
# ['abc','abc','abc','abc']
# \w 匹配字母数字加下划线
print(re.findall("\w","hello_123 * -+"))
# ['h', 'e', 'l', 'l', 'o', '_', '1', '2', '3']
print(re.findall("a\wb","a1b a_b a+b a-b aab aaaaaab")) #
# ['a1b', 'a_b', 'aab', 'aab']
# \W 匹配非字母数字加下划线
print(re.findall("\W","hello_123 * -+"))
# [' ', '*', ' ', '-', ' ', '+']
# \s 匹配任意空白字符
print(re.findall("\s","a b \n\tc123"))
# [' ', ' ', ' ', '\n', '\t']
# \S 匹配任意非空白字符
print(re.findall("\S","a b \n\tc123"))
# ['a', 'b', 'c', '1', '2', '3']
# \d 匹配任意数字 等同于(0-9)
print(re.findall("\d","a b \n\tc123"))
# ['1', '2', '3']
# \D 匹配任意非数字
print(re.findall("\D","a b \n\tc123"))
# ['a', ' ', 'b', ' ', ' ', '\n', '\t', 'c']
# ^ 匹配字符串开头
print(re.findall("^a\wb","a1b a_b a+b a-b aab aaaaaab"))
# ['a1b'] # ^ 代表从头开始匹配,找到就结束
# $ 匹配字符串的末尾
print(re.findall("a\wb$","a1b a_b a+b a-b aab aaaaaab"))
# ['aab'] # $代表从末尾开始匹配,找到就结束
print(re.findall('^egon$',"egon"))
# ['egon']
# \A 匹配字符串开始 \Z 匹配字符串结尾
print(re.findall('\Aegon\Z',"egon"))
# ['egon']
# \A和\Z 与 ^和$ 的区别
print(re.findall('^egon$',"""
egon
123egon
egon123
egon
""",re.M))
# ['egon', 'egon']
print(re.findall('\Aegon\Z',"""
egon
123egon
egon123
egon
""",re.M))
# [] # \A \Z 是会忽略 re.Multiline 选项
# \n匹配换行符 \t匹配制表符 # \n \t 都是空
print(re.findall('\n',"a\nb\nc"))
# ['\n', '\n']
print(re.findall('\t',"a\tb\nc"))
# ['\t']
print(re.findall('\n',"""
a
b
c
"""))
# ['\n', '\n', '\n', '\n']
# .匹配任意字符,除了换行符
print(re.findall('a.c',"a1c a2c aAc a\nc aaaac"))
# ['a1c', 'a2c', 'aAc', 'aac']
# .匹配,当re.DOTALL标记被指定时,可以匹配包括换行符的任意字符
print(re.findall('a.c',"a1c a2c aAc a\nc aaaac",re.DOTALL))
# ['a1c', 'a2c', 'aAc', 'a\nc', 'aac']
# []用来表示一组字符串,单独列出
print(re.findall('a[1+]c',"a1c a+c aAc a\nc aaaac",re.DOTALL))
# ['a1c', 'a+c']
print(re.findall('a[0-9]c',"a1c a9c a10c aAc a\nc aaaac",re.DOTALL))# 匹配0-9的范围
# ['a1c', 'a9c']
print(re.findall('a[a-z]c',"a1c a9c a10c aAc a\nc aaaac",re.DOTALL))
# ['aac']
print(re.findall('a[A-Z]c',"a1c a9c a10c aAc a\nc aaaac",re.DOTALL))
# ['aAc']
print(re.findall('a[-+*/]c',"a+c a-c a*c a/c a1c a9c aAc"))
# ['a+c', 'a-c', 'a*c', 'a/c']
print(re.findall('a[-+*/]c',"a+c a-c a*c a/c a1c a9c aAc"))
# ['a+c', 'a-c', 'a*c', 'a/c']
print(re.findall('a[^-+*/]c',"a+c a-c a*c a/c a1c a9c aAc"))
# ['a1c', 'a9c', 'aAc']
# ?:左边那一个字符出现0次或者1次
print(re.findall('ab?',"b a abbbbbbbb ab"))
# ['a', 'ab', 'ab']
print(re.findall('ab{0,1}',"b a abbbbbbbb ab"))
# ['a', 'ab', 'ab']
# *:左边那一个字符出现0次或者无穷次
print(re.findall('ab*',"b a abbbbbbbb ab"))
# ['a', 'abbbbbbbb', 'ab']
print(re.findall('ab{0,}',"b a abbbbbbbb ab"))
# ['a', 'abbbbbbbb', 'ab']
# +:左边那一个字符出现1次或者无穷次
print(re.findall('ab+',"b a abbbbbbbb ab"))
# ['abbbbbbbb', 'ab']
print(re.findall('ab{1,}',"b a abbbbbbbb ab"))
# ['abbbbbbbb', 'ab']
# {n,m}:左边那一个字符出现n次或m次
print(re.findall('ab{2,4}',"b a abbbbbbbb ab"))
# ['abbbb']
print(re.findall('ab{2,4}',"b a abb abbb abbbbbbbb ab"))
# ['abb', 'abbb', 'abbbb']
print(re.findall('a.*?c',"a123dsfc+-12313xdfsfdc"))
# ['a123dsfc']
print(re.findall("href='(.+?)'","<a href='https://www.baidu.com.cn'>'我特么是百度啊'</a><a href='https://www.sina.com.cn'>'我特么是新浪啊'</a>"))
# ['https://www.baidu.com.cn', 'https://www.sina.com.cn']
print(re.findall('a.*?b','a123b ab'))
# ['a123b', 'ab']
print(re.findall('a.+?b','a123b ab'))
# ['a123b']
print(re.findall('company|companies','Too many companies have gone bankrupt, and the next one is my company'))
# ['companies', 'company']
print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))
# ['companies', 'company']
print(re.findall("a\\\\c",'a\c a1c a2c'))
# ['a\\c']
print(re.findall(r"a\\c",'a\c a1c a2c'))
# ['a\\c']
print(re.findall('\d+(?:\.\d+)?','abc11dad33.4adaxx2111asd3.4'))
# ['11', '33.4', '2111', '3.4']
res = re.search('egonxxx','123 egon egon xxx egon')
print(res.group())
res = re.match('egon','egon egon xxx egon')
print(res)
print(re.sub('^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)$',r'\5\2\3\4\1','lxx is sb'))
print(re.sub('^\w+','LXXXXXXXXXXXXXXXXXX','lxx is sb'))
pattern = re.compile("egon",re.M)
print(pattern.findall("egon xxx egon"))
print(pattern.search("asdfasdfsadfegonasdfon"))
json&pickle模块
什么是序列化?为什么要序列化?
序列化就是把内存当中的数据转成一种其它格式,这种格式可以存到文件里去
反序列化就是从文件里读出一种格式,可以把这种格式反解成内存当中的数据类型
1、持久保存状态需知一个程序的执行就在处理一系列状态的变化,'状态'会以各种各样有结构的数据类型的形
式被保存在内存中。内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关
于这个程序的之前一段时间的数据(有结构)都被清空了。在断电或重启程序之前将程序当前内存中所有的数
据都保存下来(存档),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。
2、跨平台数据交互序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,
如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平
台数据交互。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
json
import json
# 序列化
dic = {'name':"egon","xxx":True,"yyy":None,"zzz":1.3}
dic_json = json.dumps(dic)
# print(dic_json,type(dic_json))
with open('a.json',mode='wt',encoding='utf-8') as f:
f.write(dic_json)
json.dump(dic,open('a.json',mode='wt',encoding='utf-8'))
# 反序列化
with open('a.json',mode='rt',encoding='utf-8') as f:
res = f.read()
dic = json.loads(res)
print(dic["xxx"])
dic = json.load(open('a.json',mode='rt',encoding='utf-8'))
print(dic['xxx'])
res = json.dumps((1,2,3))
print(res)
dic = json.loads("{'k':true}")
print(dic)
json.dumps({1,2,3,4,5})
json与python内置数据类型的区别

pickle
Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。
import pickle
res = pickle.dumps({1,2,3,4,5})
pickle.dump({1,2,3,4,5},open('b.pkl',mode='wb'))
s = pickle.load(open('b.pkl',mode='rb'))
print(s,type(s))
猴子补丁
# 一.什么是猴子补丁?
属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。
猴子补丁的核心就是用自己的代码替换所用模块的源代码,详细地如下:
1,这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音
和gorllia(猩猩)相似,再后来就写了monkey(猴子)。
2,还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about
(顽皮的),所以叫做Monkey Patch。
# 二. 猴子补丁的功能(一切皆对象)
1.拥有在模块运行时替换的功能, 例如: 一个函数对象赋值给另外一个函数对象(把函数原本的执行的功能给替换了)
# 三.monkey patch的应用场景
如果我们的程序中已经基于json模块编写了大量代码了,发现有一个模块ujson比它性能更高,
但用法一样,我们肯定不会想所有的代码都换成ujson.dumps或者ujson.loads,那我们可能
会想到这么做
# import ujson as json # 但是这么做的需要每个文件都重新导入一下,维护成本依然很高
# 此时我们就可以用到猴子补丁了
import json
import ujson # pip3 install ujson
def monkey_patch_json():
json.dump = ujson.dump
json.dumps = ujson.dumps
json.load = ujson.load
json.loads = ujson.loads
monkey_patch_json()
[re模块、json&pickle模块]的更多相关文章
- os模块/sys模块/json/pickle模块/logging模块(day16整理)
目录 今日内容 os模块 对文件操作 对文件夹此操作 辅助性的 了解 sys模块 json和pickle模块 json模块 pickle模块 logging模块 日志级别 添加设置 自定义配置 今日内 ...
- os模块 sys模块 json/pickle 模块 logging模块
目录 模块 1. os模块 2. sys模块 3. json和pickle模块 4. logging模块 (1)日志配置 (2)实际开发中日志的使用 模块 1. os模块 os模块有什么用 与操作系统 ...
- sys模块 json pickle模块
# sys模块# import sys# sys.path# sys.argv# sys.exit() # 脚本退出# print('[%s]'%('#'*1))# print('[%s]'%('#' ...
- Pythoy 数据类型序列化——json&pickle 模块
Pythoy 数据类型序列化--json&pickle 模块 TOC 什么是序列化/反序列化 pickle 模块 json 模块 对比json和pickle json.tool 命令行接口 什 ...
- python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)
一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...
- python中序列化json模块和pickle模块
内置模块和第三方模块 json模块和pickle 模块(序列化模块) 什么是序列化? 序列化就是将内粗这种的数据类型转成另一种格式 序列化:字典类型——>序列化——>其他格式——>存 ...
- Python之路(第十五篇)sys模块、json模块、pickle模块、shelve模块
一.sys模块 1.sys.argv 命令行参数List,第一个元素是程序本身路径 2.sys.exit(n) 退出程序,正常退出时exit(0) 3.sys.version . sys.maxint ...
- 面向对象进阶------>模块 json pickle hashlib
何为模块呢? 其实模块就是.py文件 python之所以好用就是模块多 模块分三种 : 内置模块 . 拓展模块.自定义模块. 现在我们来认识:内置模块中的 序列化模块和 hashlib 模块 1 ...
- python模块--json \ pickle \ shelve \ XML模块
一.json模块 之前学习过的eval内置方法可以将一个字符串转成一个python对象,不过eval方法时有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,e ...
- python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则
python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess ...
随机推荐
- (三)SpringBoot启动过程的分析-创建应用程序上下文
-- 以下内容均基于2.1.8.RELEASE版本 紧接着上一篇(二)SpringBoot启动过程的分析-环境信息准备,本文将分析环境准备完毕之后的下一步操作:ApplicationContext的创 ...
- 拖拽方式生成Vue用户界面
前一阵子拜访了一些小伙伴,大家都表示苦前端太久了,需要花费不少时间在前端开发上.本着在不损失灵活性的前提下尽可能提高开发效率的原则,作者尝试在框架内集成了拖拽方式生成Vue用户界面的功能作为补充, ...
- 经过努力+作弊,我终于完成了leetcode通过率最低的一道题
前两天刷leetcode的时候,突发奇想,leetcode中最难的一道题是什么样子的呢? 于是,我就将所有题目(https://leetcode-cn.com/problemset/all/ )按照通 ...
- 第3 章 : Kubernetes 核心概念
Kubernetes 核心概念 本文整理自 CNCF 和阿里巴巴联合举办的云原生技术公开课的课时 3:Kubernetes 核心概念.本次课程中,阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李 ...
- OO_Unit1_表达式求导总结
OO_Unit1_表达式求导总结 OO的第一单元主要是围绕表达式求导这一问题布置了3个子任务,并在程序的鲁棒性与模型的复杂度上逐渐升级,从而帮助我们更好地提升面向对象的编程能力.事实也证明,通过这 ...
- 【剑指offer】8:跳台阶
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 解题思路: 这种题目多为找规律求通用公式并最终用代码实现. 首先,考 ...
- 死磕Spring之AOP篇 - Spring AOP自动代理(三)创建代理对象
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- Tomcat9配置HTTP/2
1 概述 Tomcat从Tomcat8的一些较新版本就支持HTTP/2了,Tomcat9直接支持,本文首先讲述了相关HTTP/2的特性,接着利用一个简单的开源工具mkcert生成证书并利用该证书配置H ...
- vim与系统剪贴版的交互
1 概述 vim中的复制,删除,替换(d,r,s,x,y等)的内容都会被保存到默认的未命名的寄存器中,之后可以通过p进行粘贴,但是,这个寄存器不是系统的剪贴版,很多时候需要vim与系统剪贴版的交互,那 ...
- 数栈运维实例:Oracle数据库运维场景下,智能运维如何落地生根?
从马车到汽车是为了提升运输效率,而随着时代的发展,如今我们又希望用自动驾驶把驾驶员从开车这项体力劳动中解放出来,增加运行效率,同时也可减少交通事故发生率,这也是企业对于智能运维的诉求. 从人工运维到自 ...