一.python的垃圾回收机制

  1.引用计数(垃圾回收机制的根本)

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

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

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

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

  2.标记清除

    1.循环导入(内存泄漏)

     ls1 = [666]
     ls2 = [888]
     ls1.append(ls2)
     ls2.append(ls1)

     print(ls1) # [666, [888, [...]]]

     print(ls2) #[888, [666, [...]]]

     list1与list2是相互引用的,产生了内存泄漏

     即使不存在其他对象对它们的引用list1与list2的引用计数也将持续为1,它俩所占用的内存永远无法被回收

    2.循环导入的解决(标记清除)

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

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

   

3.分代回收

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

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

     本质:新定义的变量,放到新生代中,假设每隔一分钟扫描新生代一次,如果发现变量依然被引用,

        那么这个对象的权重加一,当变量权重大于设定值(假设为3)时,会将他移动到高一级的青春代,

青春代的扫描频率低于新生代(扫描时间间隔更长),这样每次GC需要扫描的变量总数就变少了,

        节省了臊面的总时间,接下来,青春代的对象也会以同样的方式被移动到老年代中,即等级(代)越高,

        被GC扫描的频率就越低

二.正则

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

  1.单个字符 

   \d == [0-9]

   \D == [^0-9]

   \w == 字母,数字,下划线

   [0-9A-Za-z] == 所有字母+数字

    . == 匹配所有单个字符(刨除换行)

import re
print(re.findall(r'.', '123[\a b\nc\ta\rbcABC好好*_12')) # 匹配所有单个字符(刨除换行)
print(re.findall(r'\s', '123[\a b\nc\ta\rbcABC好好*_12')) # 匹配所有空白、制表符、换行符、回车符
print(re.findall(r'\S', r'123[\abcabcABC好好*_12')) # 字母+数字+_ 对立面
print(re.findall(r'\w', r'123[\abcabcABC好好*_12')) # 字母+数字+_
print(re.findall(r'[A-Za-z0-9好]', r'123[\abcabcABC好好')) # 字母+数字
print(re.findall(r'[A-Z]|[a-z]', r'123[\abcabcABC')) # 字母 a|b => 匹配a或b
print(re.findall(r'[0-9]', r'123\abcabc')) # 数字
print(re.findall(r'\D', r'123\abcabc')) # 非数字
print(re.findall(r'\d', r'123\abcabc')) # 数字
print(re.findall(r'a', r'123\abcabc'))

2.多个字符

   zo* == zo{0,} # 0到n

   zo+ == zo{1,} # 1到n

   zo? == zo{0,1}

   应用:匹配多个zo:zozozozo

     (?:zo){1,}

import re
print(re.findall(r'zo*?', r'zzozoozooo')) # {0,n} 1到n个,非贪婪匹配,尽可能少的匹配 == {0}
print(re.findall(r'zo+?', r'zzozoozooo')) # {1,n} 1到n个,非贪婪匹配,尽可能少的匹配 == {1}
print(re.findall(r'zo?', r'zzozoozooo')) # {0,1} 0到1个,贪婪匹配,尽可能多的匹配
print(re.findall(r'zo+', r'zzozoozooo')) # {1,n} 1到n个,贪婪匹配,尽可能多的匹配
print(re.findall(r'zo*', r'zzozoozooo')) # {,n} 0到n个,贪婪匹配,尽可能多的匹配
print(re.findall(r'o{1,2}', r'foodfoood')) # {n,m} n到m个,贪婪匹配,尽可能多的匹配
print(re.findall(r'o{2,}', r'foodfoood')) # {n, } n到多个,贪婪匹配,尽可能多的匹配
print(re.findall(r'[a-z]{2}', r'123\abcabc')) # {n} n代表个数
print(re.findall(r'ab', r'123\abcabc'))

3.多行

   ^:以什么开头 $:以什么结尾 结合flag=re.M,可以按\n来完成多行匹配

   re.S:将\n也能被.匹配 re.I:不区分大小写

print(re.findall(r'^owen.+vv$','owen_name_vv\nowen_age_vv\nzero_owen\nowen_oo',
re.M))

4.分组

   1.从左往右数( 左括号进行编号,自己的分组从1开始,group(0)代表匹配到的目标整体

   2.(?:...):取消所属分组()就是普通(),可以将里面的信息作为整体包裹,但不产生分组

regexp = re.compile('(?:(?:http://)\((.+)\)/)')  # 生成正则对象
target = regexp.match('http://(www.baidu.com)/')
print(target.group(1)) # www.baidu.com result=re.findall(r'^http://.+/$','http://www.baidu.com/\nhttp://www.sina.com.cn/', re.M)
for res in result:
t = re.match('http://(.+)/', res)
print(t.group(1)) # www.baidu.com
www.sina.com.cn

5.拆分

   print(re.split('\s', '123 456\n789\t000')) # ['123', '456', '789', '000']

  6.替换

   1.不参与匹配的原样带下

   2.参与匹配的都会被替换为指定字符串

   3.指定字符串值\num拿到具体分组

   4.其他字符串信息都是原样字符串

print(re.sub('(?:[a-z]+)(\d+)(.{2})', r'\2abc\2\1', '《abc123你好》'))
print(re.sub('[0-9]+', '数字', 'abc123你好'))
# 《你好abc你好123》
‘abc数字你好‘

Day 21 内存处理与正则的更多相关文章

  1. DAY 21内存处理与正则

    一.python的垃圾回收机制 1.引用计数(垃圾回收机制的根本) 1.引用计数是用来记录值的内存地址被记录的次数的 2.每一次对值地址的引用都可以使该值的引用计数+1 3.每一次对值地址的释放都可以 ...

  2. day 21 内存管理,正则

    一.内存管理 1.垃圾回收 不能被程序访问到的数据,就称之为垃圾. 2.引用计数 引用计数是用来记录值得内存地址被记录的次数 每一次对值地址的引用都可以使得该值的引用计数+1 每一次对值地址的释放都可 ...

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

    内存管理 垃圾回收机制 不能被程序访问到的数据,就称之为垃圾 也就是失去了一个能够访问到值数据的名称空间,导致在内存中无作为 引用计数:是内存管理的原理 引用计数是用来记录值的内存地址被记录的次数 每 ...

  4. [整理]内存重叠之memcpy、memmove

    函数原型: void *memcpy( void *dest, const void *src, size_t count ); void *memmove( void* dest, const vo ...

  5. 内存Zone中的pageset成员分析

    1: struct per_cpu_pageset __percpu *pageset; 首先,分析一个函数,__free_pages,这个函数是Buddy System提供的API接口函数,用于翻译 ...

  6. 函数返回多个值(c/c++)

    当我们在处理一个数组的时候常常会碰到这样的问题:输入一个数组,和数组的一个元素,返回该元素所在行数和列数.这样就需要返回多组两个值,且组数不定.上述类型的函数在c语言程序里面存在两个问题.第一,函数只 ...

  7. Swif基本语法以及与OC比较三

         (未 经 博 主 同 意,不 得 转 载 !)   ------------------------华丽分割线----------------------- // // main.swift ...

  8. C语言完美体系

    **第 1 篇 C 语言第一阶段 13 1.1C 语言第一阶段--语言课程概述 13 1.1.1 什么是语言,什么是 C 语言 13 1.1.2 基本常识 14 1.1.3 人与计算机之间的更好的交互 ...

  9. DAY21、面向对象

    一.内存管理与正则语法1.内存管理:引用计数:垃圾回收机制工作原理 引用就 +1 ,释放就 -1 ,当计数为0时,就会被垃圾回收机制回收标记清除:解决循环导入引用导致的内存泄漏 标记:GC roots ...

随机推荐

  1. flask记录

    flask文件上传 flask 文件上传  https://www.cnblogs.com/wongbingming/p/6802660.html flask多文件上传:https://blog.cs ...

  2. shell编程(二)

    第三十二次课 shell编程(二) 目录 十五.shell中的函数 十六.shell中的数组 十七.告警系统需求分析 十八.告警系统主脚本 十九.告警系统配置文件 二十.告警系统监控项目 二十一.告警 ...

  3. dict的几个要点

    1. 采用key,value键-值对进行存储 2. key必须是不可变对象 3. key值不能重复 添加元素: aDict = {'1':'aaa','b':'bbb','3':'ccc'} aDic ...

  4. cocos图片的选择以及压缩

    我们在使用cocos在windows平台下,运行速度很快很流畅,很强大,可是当我们打包成apk文件,在手机上运行的时候,流畅度很可能降低,甚至还有间歇性内存彪高. 游戏内存优化我们一般可以从这么3个方 ...

  5. 马凯军201771010116《面向对象与程序设计Java》第十一周学习总结

    一.理论知识部分 第九章  集合 1.数据结构介绍:线性结构:线性表,栈,队列,串,数组,文件.非线性结构:树,图. 散列表:又称为哈希表. 散列表算法的基本思想是:以结点的关键字为自变量,通过一定的 ...

  6. VBA在WORD应用中如何将格式应用于选定内容

    下列示例使用 Selection 属性将字符和段落格式应用于选定文本.使用 Font 属性获得字体格式的属性和方法,使用 ParagraphFormat 属性获得段落格式的属性和方法. Sub For ...

  7. centos7.4 调整根目录大小

    由于系统初始时根目录一般空间为50左右 有时会被占满,而/home目录却有大量空间 这里需要调整: 1.终止占用 /home 进程 fuser -m -v -i -k /home​ 2.备份/home ...

  8. 不使用Visual Studio开发ASP.NET MVC应用(上篇)

    入行十多年,工作闲暇,还是对信息技术比较关注,经常测试一些新的技术,感受一下科技发展给大家带来的便利.Visual Studio接触也有年头了,对它总感觉乎近乎远的,既熟悉又陌生,一直没有像用别的工具 ...

  9. 定时器setTimeout()和Node.js的Event Loop

    一.定时器 setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行.它在"任务队列"的尾部添加一个事件,因此要等到同步任务和 ...

  10. WEB学习笔记14-HTML5新特性的使用

    (1)定义文档类型声明 <!DOCTYPE html> (2)定义页面编码 <!—HTML 4.01中定义的设置页面编码的方式--> <meta http-equiv=& ...