装饰器
1.OCP原则(open close protocol):对已有运行(稳定的)代码,不应该修改它,如果你增加新的功能,添加新的功能代码即可对修改关闭、对增加扩展开放。
2.什么是装饰器
装饰器就是一个闭包函数,它能够@闭包名称装饰一个原有的函数,是的原有函数的功能更加的强大
3.如何定义装饰器
1)定义一个闭包,闭包有一个默认的参数,是一个引用,该引用就是需要装饰的函数
2)一个需要在内层函数里面调用(函数),在fn()调用之前写的代码就会被装饰在原函数之前,在fn()调用之后的代码,会被装饰在原函数之后。
eg1:
运行结果:
eg2:
运行结果:
4.python动态语言允许动态添加或者删除属性和方法
class User(object):
def __init__(self):
self.name = "xixi"
self.age = 16
if __name__ == '__main__':
u1 = User()
print(u1.name)
print(u1.age)
# 动态语言的特性
u1.gender = "girl"
print(u1.gender)
del u1.name
print(u1.name)
运行结果:
正则表达式
一. 什么是正则
正则表达式,正则匹配式、表示式,使用一些特殊符号来匹配、查找、替换字符串文本的一种技术。
二.re模块
>>> import re
>>> res=re.match("today","today is rainy")
>>> res.group()# 将匹配的结果显示
使用 res.group()提取匹配结果,
如果是,则返回匹配对象(Match Object),否则返回 None
'today'
1.元字符
使用re.match来匹配开头(第一个符号),有则返回匹配的东东,没有则显示None,就是啥也不显示
. # 匹配任意符号(除换行符外(\n))
\d # 匹配数字 digest
使用group方法将匹配的结果显示,匹配hello数字
\w # 匹配所有的有效(大小写字母、数字、下划线_、各国语言符号)
\s # 匹配空白位 (如:空格、\t)
^ # 以xx开头
$ # 以xxx结尾
通过re.match \w匹配任意符号开头并且以p结尾 \d.*表示以数字开头,第二个字符起为任意符号的任意位个,以p结尾
[] # 匹配 [] 里的任意字符
# [0123456789] <==> \d
有效符号:[A-Za-z0-9_]
大小写字母:[A-Za-z]
2.反义符
\D # 非数字
\W # 特殊符号
\S # 非空白位
[^] # 列举反义 注意 举例:[^]和[^]
^[]匹配[ ]里开头的
[^]匹配不是[]里的字符
re.match("[^abcd]","a")
#表示除 a、b、c、d 外的任何字符都匹配
3. 转义符
在python的字符串中\是具有特殊含义的,要正常表示一个\,需要两个\来表示。在正则中,\是具有特殊含义的,要正常表示一个\,需要两个\来表示。
建议在写正则的时候,一定要在正则表达式前面加上r
re.match("c:\\","c:\\a\\b")
# error 报错,因为\\转义后就变成了\了
re.match("c:\\\\","c:\\a\\b") #正确
re.match(r"c:\\","c:\\a\\b") # 正确,
表示匹配的字符不进行转义【推荐】,
以后匹配符不要再写出上面的的转义了。
比如你查找.,或者*,就出现了问题:你没法指定它们,因
为它们会被解释成其它的意思。这时你就必须使用\来取消这些字符的特殊意义
4.位数
* # 表示匹配*前面的任意字符,出现任意次,0次,1次,n次
+ #表示+号前面的字符 至少出现一次(至少是1位、可以有n位)
? # 匹配?前面的字符出现 0次或者1次
{n} # 有n位
{n,} # 至少n位
{n, m} # 表示n~m这个区间范围
eg:
1[356789]\d{9}匹配以 13 后面跟 9 个数字(中国的手机号)
5. 分组(group)
在正则表达式中,使用圆括号()将正则中包裹起来,会形成正则匹配后的二次筛选
分组最大的好处就是能够形成第二次筛选
案例:
1)匹配出 163 或者 162 或者 qq 或者 gmail 或者 sohu 邮箱地址,且@之前有 4 到 20 为字符
2)使用圆括号()将正则中包裹起来,会形成正则匹配后的二次筛选。第一次是0,第二次是1
3)
案例1:将一段 HTML 源代码中的标签取消:
提示:re.sub(r"</?.*?>","",s)
案例2:\1匹配分组括号里的值
re模块高级操作
1.search
执行正则表达式搜索并且在搜索结束后返回所匹配到的串,只返回第一次匹配到的结果
2.findall
匹配所有的对象,返回一个列表
当返回的数字多时,占内存,选择用迭代器
3.sub实现查找替换
4.split分割字符串,结果返回列表
分割. or *时需要转义
贪婪模式和非贪婪(懒惰)模式
在 Python 中正则默认是贪婪模式(个别语言中也可能是非贪婪模式),贪婪模式就是总会尝试匹配更多的字符。 非贪婪模式则反之,总是尝试匹配尽可能少的字符。
*? 重复任意次,但尽可能少重复
+? 重复 1 次或更多次,但尽可能少重复
?? 重复 0 次或 1 次,但尽可能少重复
{n,m}? 重复 n 到 m 次,但尽可能少重复
{n,}? 重复 n 次以上,但尽可能少重复
在 *、?、+、{m,n}后面加上?,可以将贪婪模式变成非贪婪模式。
案例1:
案例2: