16正则表达式,复制,内存管理

一。

1. ^ 除什么之外的 , \ 不让转义。

2 .代表任意字符,两个点代表任意的两个。

3. \w ASCII表中只能匹配字母数字或者下划线,ASCII表以外的都可以匹配

4.\d 0-9数字,匹配任意一个数字字符。

5.\s --匹配任意空白字符。

6. \W,\D,\S --和小写的功能相反.

二。字符集:[ 字符集 ] 匹配字符集中的任意的一个字符。[字符集1 - 字符集2] 取字符集1 到字符集2 中的任意字符,字符集1的编码值必须小于字符集2的。

1。[1-9],[0-9],[a-z],[A-Z],[a-zA-Z],匹配中文[\u4e00-\u9fa5]。

2.[\dxyz]----表示0-9或则x y z

3。[^字符集]---除字符集以外的的其他的字符。

三。检测符号

1.\b --检测是否是单词的结尾,所有可以区分出两个不同单词的符号都是单词结尾,其中字符串开头和字符串结尾。

2.检测\b所在的位置是否是单词结尾,不影响匹配的时候字符串长度。

3. ^ -- 检测字符串开头,判断^所在的位置是否是字符串开头

4. $ -检测所在的位置是否是字符串的结尾。

四。匹配的次数

1. ?匹配0次或一次

2. re_str=r"ax?b"

print(re.fullmatch(re_str,"axb"))

3. *零次或多次。

4. + 匹配一次或多次

5. {M,N},{M,},{,N} 匹配M -N,最少M,最多N。

五。贪婪和非贪婪

1。匹配次数不确定的时候有贪婪和非贪婪两种状态。

? * + {M,N} {M,} {,N}--默认是贪婪的。

贪婪--在能匹配成功的前提下,尽可能的匹配。

非贪婪,就是在贪婪的后面加上问号。取最少的。

# 非贪婪--在匹配成功的前提下尽可能少的匹配。

六 分支

正则1|正则2--如果1不成功就匹配2
只要两个当中有一个成功就成功了。
rez-str=r"\d{3}|[a-zA-Z]{3}"

七。分组

整体控制次数:()匹配次数
将正则表达式看成一个整体进行操作
重复:带分组的正则表达式\M---在\M的位置重复前面的第M个()的。

re_str=r"(\d[a-z])+"  #整体出现多次

re_str=r"(\d+)([a-z]+)=\2"   #"1ab=ab"  重复第二个()

八。拷贝

微信图片_20191127141335.png

from copy import copy,deepcopy
1.用一个变量给另一个变量赋值的时候赋值的是内存地址。修改一个另一个也修改。

class Person:
    def __init__(self,name,age=10,gender="nan"):
        self.name=name
        self.age=age
        self.gender=gender

    def __repr__(self):
        return str(self.__dict__)
        return "<%s>"%(str(self.__dict__)[1:-1])

repr这个函数会在打印当前类的对象的时候自动条用,函数的返回值就是打印的结果。 返回值必须是字符串。

p1=Person("小明")
p2=p1 #复制后p1和p2指向同一个Person对象,修改一个都会修改
p1.gender="nv"
print(p2.gender)

不管是深还是浅都会复制原数据产生新的,但是地址不一样的。

2.浅拷贝

赋值原数据产生一个新的数据, 值和原数据一样,地址不一样,将新的地址返回,如果对象中有子对象,子对象不会复制。 改变子对象会相互影响

=============================浅拷贝=======================

p1=Person("小明")
p2=copy(p1)
print(p1)
print(p2)

=============================深拷贝========================

赋值原数据产生一个新的数据, 值和原数据一样,地址不一样,将新的地址返回,如果有子对象子对象也会复制。改变子对象不会相互影响。

八。内存管理

from sys import getrefcount

这个模块函数是 来统计引用个数的。
1.内存管理都是对 堆 的(自动申请和释放),栈是系统自动的管理的。
2.内存管理基础
内存分为栈区间和堆区间,栈区间的内存是系统自动申请和自动释放的,堆上的需要程序员通过死哦阿勇malloc函数去申请,通过调用free函数去释放。、
高级语言(java/c++/oc/python)中的内存管理机制,都是针对堆上的内存的管理进行的自动化操作。
3.python的内存管理机制:
(1)内存的申请
python中所有的数据都是存在堆中的,变量是保存在栈区间的,变量中保存的是保存在堆中的数据的地址。
重新给变量赋值的时候,会先在内存中开辟新的内存地址,在把新的值赋值给变量,除了数字和字符串,其他的重新给 变量赋值都是会改变的,数字字符串是特殊的不变。
如果使用数字或则字符串给变量赋值,系统会先检查以前有没有存过该数字或则字符串,没有会重新开辟,有会直接返回以前的内存地址。

(2)内存的释放
在python中一个数据对应的内存空间是否释放,就看这个数据的引用计数是为零,如果为零就会自动释放。

================数字字符串的内存变化========

a=12
print(id(a))
a=12
print(id(a))
b="1213"
print(id(b))
b="1213"
print(id(b))

8791309972064

8791309972064

可以看出他们的地址是一样

============================内存的释放===============

list1=[1,2,3]

print(getrefcount(list1)) #这个的引用计数是2 ,因为里面的getrefcount赋值加了一个。
def yt_gettrefuonut(obj):
pass #obj=list1 这就多了# 一个

list2=list1
print(getrefcount(list1))#这个是3

1.减少引用:(删除引用,或者让引用去保存新的数据)

引用的改变和死去。

del list1
list2=100 # 一个死掉了 第二个改变了 引用

print(getrefcount(list2))

2.增加应用:(增加数据的引用(让更多的变量来保存数据的地址))

3.循环引用:python中自动处理了这个问题。(引用计数不为零的时候,再判断是不是循环,销毁其中一个,看另一个是否也销毁。)

list1=[1,2,3]
list2=[list1,10,20]
list1.append(list2)
print(list1)
print(list2)
del list1
del list2

声明一个变量不去引用就会死掉。!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值