1. 程式人生 > >內存管理與正則(re)模塊

內存管理與正則(re)模塊

模式 span 內存空間 不同的 記錄 永遠 區分 mat 掃描

內存管理

垃圾回收機制

不能被程序訪問到的數據,就稱之為垃圾

也就是失去了一個能夠訪問到值數據的名稱空間,導致在內存中無作為

引用計數:是內存管理的原理

引用計數是用來記錄值的內存地址被記錄的次數

每一次對值的地址的引用都可以使該值的引用計數+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

# re.match函數
# re.match 嘗試從字符串的起始位置匹配一個模式
# 如果不是起始位置匹配成功的話,match()就返回none。

# 三個參數
# 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寧‘))
#匹配任意空白字符,等價於[\t\n\r\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 可以按\n來完成多行匹配
# print(re.findall(‘^h‘,‘hello egon 123‘))
# print(re.findall(‘3$‘,‘hello egon 123‘))
# re.S:將\n也能被.匹配 re.I:不區分大小寫


# 4.分組
# 1.從左往右數數 ( 進行編號,自己的分組從1開始,group(0)代表匹配到的目標整體
# 2.(?: ... ):取消所屬分組,()就是普通(),可以將裏面的信息作為整體包裹,但不產生分組

# regexp = re.compile(‘(?:(http://)\((.+)\)/)‘) # 生成正則對象
# target = regexp.match(‘http://(www.baidu.com)/‘)
# print(target.group(2))

# 5.拆分
# split 方法按照能夠匹配的子串將字符串分割後返回列表,它的使用形式如下:
# re.split(pattern, string[, maxsplit=0, flags=0])
# 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)模塊