• 内存管理与正则(re)模块


    内存管理

    垃圾回收机制

    不能被程序访问到的数据,就称之为垃圾

    也就是失去了一个能够访问到值数据的名称空间,导致在内存中无作为

    引用计数:是内存管理的原理

    引用计数是用来记录值的内存地址被记录的次数

    每一次对值的地址的引用都可以使该值的引用计数+1

    每一次对值的地址的释放都可以使该值的引用计数-1

    当一个值的引用计数为0时,该值就会被系统的垃圾回收机制回收

    循环导入

    ls1=【666】

    ls2=【888】

    ls1.append(ls2)

    ls2.append(ls1)

    print(ls1)

    print(ls2)

    循环导入会导致内些值的引用计数永远大于0

    标记删除

    标记:标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,存放到新的内存空间中

    删除:删除的过程将遍历所有的对象,将之前所有的内容全部清除

    优化机制:分代回收

    分代:指的是根据存活时间来为变量划分不同等级(也就是不同的代)

    新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某个设定得值(假设为3),会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低

    回收:依然是使用引用计数作为回收的依据

    re 正则模块

    什么是正则:正则就是带语法的字符串,用来匹配目标字符串得到想要的字符串结果

    语法:

    import re

    findall 方法

    在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。



    # 三个参数
    # pattern 匹配的正则表达式
    # string 要匹配的字符
    # flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
    # 匹配成功re.match方法返回一个匹配的对象,否则返回None。

    # 1.单个字符

    # w与W
    # print(re.findall('w','hello_egon 123宁'))
    # w 匹配字符数字及下划线
    # print(re.findall('W','hello_egon 123宁'))
    # W匹配非字母数字下划线

    #s与S
    # print(re.findall('s','hello_egon 123宁'))
    #匹配任意空白字符,等价于[ f]
    # print(re.findall('S','hello_egon 123宁'))
    #匹配任意非空格字符串

    # d与D
    # print(re.findall('d','hello_egon 123宁'))
    # 匹配任意数字,等价于[0-9] d
    # print(re.findall('D','hello_egon 123宁'))
    # 匹配任意非数字 D

    # [0-9A-Za-z] == 所有字母+数字
    # print(re.findall(r'[A-Za-z0-9]宁',r'hello_egon 123宁')) #这是组合两个符合条件的字符串
    # print(re.findall(r'[A-Za-z0-9宁]',r'hello_egon 123宁'))

    # . 匹配所有单个字符(刨除换行)
    # print(re.findall('a.','a123b'))
    # ==>['a1']
    # print(re.findall('a.b','a1b'))
    # ==>['a1b']

    # 多个字符

    # 匹配0个或多个的表达式 *
    # print(re.findall('ab*','bbbbbbb'))
    # ==》 []
    # print(re.findall('ab*','a'))
    # ==》 ['a']
    # print(re.findall('ab*','abbbb'))
    # ==> ['abbbb']

    # 匹配1个或多个的表达式 +
    # print(re.findall('ab+','bbbbbbb'))
    # ==》 []
    # print(re.findall('ab+','a'))
    # ==》 []
    # print(re.findall('ab+','abbbb'))
    # ==> ['abbbb']

    # 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 ?
    # print(re.findall('ab?','a'))
    # print(re.findall('ab?','abbb'))

    # {n}精确匹配n个前面表达式,并且只返回它前面的字符,多了返回空值。
    # print(re.findall('ab{2}','abbbc'))
    # ==》 ['abb']

    # {n,m}匹配n到m次由前面的正则表达式定义的片段,贪婪方式,并且只返回它前面的字符,最小值多了返回空值。
    # print(re.findall('ab{1,2}','abbb'))
    # ==》 ['abbb']
    # print(re.findall('ab{1,}','abbbc'))
    # ==》 ['abbb']

    # a|b 匹配a或b
    # print(re.findall('a|b','a b b cb'))
    # ==> ['a', 'b', 'b', 'b']

    # ()匹配括号内的表达式,也表示一个组
    # print(re.findall('ab+','ababab123'))
    # ==> ['ab', 'ab', 'ab']
    # print(re.findall('(ab)+123','ababab123'))
    # 匹配到末尾的ab123中的ab ==》 ['ab']
    # print(re.findall('(?:ab)+123','ababab123'))
    # findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
    # ==》 ['ababab123']

    # print(re.findall('(zo){1,}','zozozozo'))
    # ==> ['zo']
    # print(re.findall('(?:zo){1,}','zozozozo'))
    # ==> ['zozozozo']


    # 3.多行
    # ^: 以什么开头 $: 以什么结尾 结合 flags=re.M 可以按 来完成多行匹配
    # print(re.findall('^h','hello egon 123'))
    # print(re.findall('3$','hello egon 123'))
    # re.S:将 也能被.匹配 re.I:不区分大小写


    # 4.分组
    # 1.从左往右数数 ( 进行编号,自己的分组从1开始,group(0)代表匹配到的目标整体
    # 2.(?: ... ):取消所属分组,()就是普通(),可以将里面的信息作为整体包裹,但不产生分组

    有名分组(?P<name>...)

    # regexp = re.compile('(?:(http://)((.+))/)') # 生成正则对象
    # target = regexp.match('http://(www.baidu.com)/')
    # print(target.group(2))

    re.match函数

    
    

    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

     

    re.split  拆分


    # split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
    # re.split(pattern, string[, maxsplit=0, flags=0])
    # print(re.split('s', '123 456 789 000'))

    re.sub   检索和替换

    Python 的re模块提供了re.sub用于替换字符串中的匹配项。


    # 1.不参与匹配的原样带下 2.参与匹配的都会被替换为指定字符串
    # 3.在指定字符串值 um拿到具体分组 4.其他字符串信息都是原样字符串
    # print(re.sub('《(?:[a-z]+)(d+)(.{2})', r'\2abc21', '《abc123你好》'))

    re.search方法

    re.search 扫描整个字符串并返回第一个成功的匹配。

  • 相关阅读:
    Netty大小端
    手写简单IOC
    Java线程
    mysql查询性能问题,加了order by速度慢了
    字节码增强技术探索
    Linux 添加定时任务
    一千行 MySQL 学习笔记
    深入浅出Shiro系列
    深入浅出SpringMVC系列~
    来聊一聊 Linux 常用命令 (第二篇)~
  • 原文地址:https://www.cnblogs.com/SlookUp/p/10719510.html
Copyright © 2020-2023  润新知