一。
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" 重复第二个()
八。拷贝
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