21 re正则模块 垃圾回收机制
垃圾回收机制
不能被程序访问到的数据,就称之为垃圾
引用计数
引用计数:用来记录值的内存地址被记录的次数的;当一个值的引用计数为0时,该值就会被系统的垃圾回收机制回收
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。每一次对值地址的引用都可以使该值的引用计数 +1
每一次对值地址的释放都可以使该值的引用计数 -1
循环导入
循环导入会导致某些值得引用计数永远大于0 => 内存泄漏
ls1 = [666] ls2 = [888] ls1.append(ls2) # >>>[666, [888, [...]]] ls2.append(ls1) # >>>[888, [666, [...]]]
标记删除
标记:标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),
然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,存放到新的内存空间中
删除:删除的过程将遍历堆中所有的对象,将之前所有的内容全部清除
分代回收
分代:指的是根据存活时间来为变量划分不同等级(也就是不同的代)
回收:依然是使用引用计数作为回收的依据
新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某个设定得值(假设为3),会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低
正则
正则:就是带语法的字符串,用来匹配目标字符串得到想要的字符串结果
|
# 语法: # 1.单个字符 # \d == [0-9] # \D == [^0-9] # \w == 字母+数字+_ # [0-9A-Za-z] == 所有字母+数字 # . == 匹配所有单个字符(刨除换行) # 2.多个字符 # zo* == zo{0,} # zo+ == zo{1,} # zo? == zo{0,1} # 应用 # 匹配多个zo:zozozozo # (?:zo){1,} # 3.多行 # ^: 以什么开头 $: 以什么结尾 结合 flags=re.M 可以按\n来完成多行匹配 # re.S:将\n也能被.匹配 re.I:不区分大小写 re.M:结合^ $来使用,完成多行匹配
# 4.分组 # 1.从左往右数数 ( 进行编号,自己的分组从1开始,group(0)代表匹配到的目标整体 # 2.(?: ... ):取消所属分组,()就是普通(),可以将里面的信息作为整体包裹,但不产生分组
import re regexp = re.compile('(?:(?:http://)(.+)/)') # 生成正则对象 target = regexp.match('http://www.baidu.com/') print(target.group(1)) # www.baidu.com # 5.拆分 print(re.split('\s', '123 456\n789\t000')) # 6.替换 # 1.不参与匹配的原样带下 2.参与匹配的都会被替换为指定字符串 # 3.在指定字符串值\num拿到具体分组 4.其他字符串信息都是原样字符串 print(re.sub('《(?:[a-z]+)(\d+)(.{2})', r'\\2abc\2\1', '《abc123你好》'))
首先介绍的是re模块的findall方法,该方法用于从字符串中获取所有匹配成功的内容:
import re res = re.findall("表达式","字符串内容") res = re.findall("\w","hello python") res = re.findall("^http://","http://www.baidu.com\nhttp://www.sina.com.cn", re.M) # 该方法得到一个列表 print(res)

# 单个字符匹配 \w \W \s \S \d \D . \r \n \t单个字符匹配

# 指定匹配范围 a|b|c [abc] [^abc] [a-z] [a-zA-Z0-9] 注意当 -需要作为普通字符时必须写在最前面或最后面指定匹配范围

# 匹配次数 {a} {b,} {a,b} \* ?匹配次数

# 位置匹配 ^ $ \d \B位置匹配

# 贪婪模式 默认情况下+和*将尽可能多的匹配内容 \+ * # 非贪婪模式 将尽可能少的匹配内容,当?出现在其他的重复次数后面时会将贪婪模式改为非贪婪模式。 ? 如 abc.*? abc.+?贪婪模式 | 非贪婪模式

# 分组 用于单独获取某一部分匹配的内容 (表达式)获取匹配的 (?:表达式) 不获取匹配的 补充: #匹配模式:.不能匹配换行符 content='''Hello 123456 World_This is a Regex Demo ''' # res=re.match('He.*?(\d+).*?Demo$',content) # print(res) #输出None # res=re.match('He.*?(\d+).*?Demo$',content,re.S) #re.S让.可以匹配换行符 # print(res) # print(res.group(1))分组

# re模块其他函数 search 仅获取第一个匹配的内容 match 从字符串开始处开始匹配 compile 得到一个的表达式对象,后期可以重复使用 split 使用正则表达式来切分字符串 ```python re.split("[:\/\\]","a:b/c\d/f") ``` sub 普通替换与字符串的替换没有区别 print(re.sub("python","PYTHON","python asasasaasa python")) 正则替换 只替换后面的python print(re.sub("(python)(.*)(python)",r"\1\2PYTHON","python asasasaasa python")) # 练习 - 编写验证身份证的正则 - 编写验证手机号的正则 - 编写验证邮箱地址的正则re模块其他函数

更多精彩