python高级(装饰器&正则表达式)

本文介绍了Python中的装饰器和正则表达式。装饰器是一种闭包函数,遵循OCP原则,用于扩展原有函数功能。文章详细讲解了如何定义和使用装饰器,并给出了实例。正则表达式部分讲述了什么是正则,以及Python的re模块,包括元字符、反义符、位数、分组等概念,并提供了多个实际应用示例。
摘要由CSDN通过智能技术生成

装饰器

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:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值