zoukankan      html  css  js  c++  java
  • 内存管理 re模块

    # 内存垃圾回收机制:
    #     工作原理:引用计数
    #         引用就+1 释放就是-1 当计数为0时 就会被垃圾回收机制回收
    
    #     标记清除:解决循环引用导致的内存泄漏
    #         标记:GC roots可以直接或间接访问到的数据,都标记为存活状态
    #         清除:触发标记清楚动作后,将所有存活状态的变量复制到新空间,将老空间中的所有值清空
    #       分代回收:提高回收效率的优化策略
    #         分代:将产期存活的变量移至更高代,检查频率降低
    #         回收:回收的依据还是采用引用计数
    #          循环引用 => 内存泄漏
    #             ls1 = [666]
    #             ls2 = [888]
    #             ls1.append(ls2)
    #             ls2.append(ls1)
    # print(ls1)  [666, [888, [...]]]
    
    # print(ls2)[888, [666, [...]]]
    
    # re 正则
    # 一什么是正则?
    # 正则就是用一些具有特殊含义的符号组合到一起(称之为正则表达式)来描述字符或者字符串的方法
    # 或者说:正则就是用来描述一类事物的规则,(在python中)它内嵌在python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码。然后由c编写的皮匹配引擎执行
    # 二常用匹配模式(元字符)
    #     w  匹配字母数字及下划线
    #     W 匹配非字母数字下划线
    #     s 匹配任意空白字符 等价于[	
    
    f]
    #     S 匹配任意非空字符
    #     d 匹配任意数字,等价于[0-9]
    #     D 匹配任意非数字
    #     A 匹配字符串开始
    #      匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
    #     z 匹配字符串结束
    #     G 匹配最后匹配完成的位置
    #     
     匹配一个换行符
    #     	 匹配一个制表符
    #     ^  匹配字符串的开头
    #     $  匹配字符串的末尾
    #     .  匹配任意字符,除来换行符,当re.DOTALL标记被指定是,则可以匹配包含换行符的任意字符
    #     [...]  用来表示一组字符,单独列出来:[amk] 匹配 'a','m'或'k'
    #     [^....] 不在[]的字符: [^abc]: 匹配除了a b c 之外的字符
    #     *  匹配0个或多个表达式
    #     +  匹配1个或多个的表达式
    #     ?  匹配0个或1个有前面的正则表达式定义的片段,非贪婪方式
    #     {n}  精确匹配n个前面表达式
    #     {n,m}  匹配n到m次由前面的正则表达式定义的片段,贪婪方式
    #     a|b  匹配a或b
    #     () 匹配括号内的表达式,也表示一个组
    import re
    # s="12345http://www.baidu.com/12htp46"
    # res=re.findall(r'http://www.baidu.com/',s)
    # print(res)   #['http://www.baidu.com/']
    # 转义
    # print(re.findall(r'\a',r'123adc'))  #['\a'] 用来转义,在正则中\a代表a 原义的字符串前面要加r
    # print(re.findall('a',r'123abcabc')) #['a', 'a'] 字母
    # print(re.findall('d',r'123abcabc'))  #['1', '2', '3'] 数字
    # print(re.findall('D',r'123abcabc'))  #['\', 'a', 'b', 'c', 'a', 'b', 'c']非数字
    # print(re.findall('[0-9]',r'123abcabc')) #['1', '2', '3'] 匹配任意一个数字
    
    # 列表中-在中间表示从0到9之间的数字  [- 0 9 ]或者[0 9 -] 表示匹配列表中 -   0   9 三个中的任意一个
    
    # print(re.findall('[A-z]|[a-z]',r'123abcabcABC'))
    # #['\', 'a', 'b', 'c', 'a', 'b', 'c', 'A', 'B', 'C'] ascii码表中[65-122]|[97-122]包含
    # print(re.findall('[A-Z]|[a-z]',r'123abcabcABC'))
    # #['a', 'b', 'c', 'a', 'b', 'c', 'A', 'B', 'C']
    # print(re.findall('[0-3]|[6-9]',r'123abcabcABC48'))
    # #['1', '2', '3', '8']
    # print(re.findall('[A-Za-z0-9好]',r'123[abcabcABC好好'))
    # #['1', '2', '3', 'a', 'b', 'c', 'a', 'b', 'c', 'A', 'B', 'C', '好', '好']
    # print(re.findall('w',r'123[abcabcABC*_12'))
    # #['1', '2', '3', 'a', 'b', 'c', 'a', 'b', 'c', 'A', 'B', 'C', '_', '1', '2'] 字母数字下划线
    # print(re.findall('S',r'123[abcabcABC好好*_12')) #任意非空字符
    # ['1', '2', '3', '[', '\', 'a', 'b', 'c', 'a', 'b', 'c', 'A', 'B', 'C', '好', '好', '*', '_', '1', '2']
    # print(re.findall('s','123[
    	
    abcabcABC好好*_12')) #匹配所有任意空白字符
    # ['
    ', '	', '
    ']
    # print(re.findall('.','123[a b
    c	a
    bcABC好好*_12'))  #匹配任意字符 除了换行符
    # ['1', '2', '3', '[', 'x07', ' ', 'b', 'c', '	', 'a', '
    ', 'b', 'c', 'A', 'B', 'C', '好', '好', '*', '_', '1', '2']
    # print(re.findall('.','a'))  #['x07']
    
    # print(re.findall('ab',r'123abcabc')) #['ab', 'ab']
    # print(re.findall('[a-z]{2}',r'123abcabc')) #['ab', 'ca', 'bc'] {n} n代表个数 a-z中的任意两个
    # print(re.findall('o{2,}','foodfooood')) #['oo', 'oooo'] {n,}n到多个 贪婪匹配 尽可能的多的匹配
    # print(re.findall('o{1,2}','foodfooood'))  #['oo', 'oo', 'oo'] {n,m} n到m个贪婪匹配,尽可能多的匹配(1到2个)
    # print(re.findall('zo*','zzozoozooo')) #  ['oo', 'oo', 'oo'] {,n} 0到n个 贪婪匹配
    # print(re.findall('zo+','zzozoozooo')) #['zo', 'zoo', 'zooo']  {,n} 1到n个 贪婪匹配
    # print(re.findall('zo?','zzozoozooo'))  #['z', 'zo', 'zo', 'zo'] {0,1} 0到1个,贪婪匹配,尽可能多的匹配
    # print(re.findall('zo+?','zzozoozooo'))  #['zo', 'zo', 'zo']  {1,n} 1到n个,非贪婪匹配,尽可能少的匹配 == {1}
    # print(re.findall('zo*?','zzozoozooo')) #['z', 'z', 'z', 'z'] {0,n} 1到n个,非贪婪匹配,尽可能少的匹配 == {0}
    
    # 多行匹配
    # re.S 将
    也能被.匹配  re.I :不区分大小写  re.M 结合^ $ 来使用,完成多行匹配
    # print(re.findall('^owen.+vv$','owen_name_vv
    owen_age_vv
    zero_owen
    owen_oo',re.M))
    # ['owen_name_vv', 'owen_age_vv']
    
    # result=re.findall(r'^http://.+/$','http://www.baidu.com/
    http://www.sina.com.cn/',re.M)
    # print(result)
    # ['http://www.baidu.com/', 'http://www.sina.com.cn/']
    # for res in result:
    #     print(res)
    # http: // www.baidu.com /
    # http: // www.sina.com.cn /
    # t=re.match('http://(.+)/',res,) #相当于search的从头开始找
    # print(t)
    # t=re.match('http://(.+)/',res,).group()
    # print(t)
    # http: // www.baidu.com /
    # http: // www.sina.com.cn /
    # <re.Match object; span=(0, 21), match='http://www.baidu.com/'>
    # <re.Match object; span=(0, 23), match='http://www.sina.com.cn/'>
    # print(t.group(0))  # group(0)代表的是('http://(.+)/) 0:最外层的括号
    # <re.Match object; span=(0, 21), match='http://www.baidu.com/'>
    # <re.Match object; span=(0, 23), match='http://www.sina.com.cn/'>
    # print(t.group(1))  # group(1)代表的是('http://(.+)/) 1:最外层的里面的左边的第一个左括号(
    # www.baidu.com
    # www.sina.com.cn
    
    # 分组:
    # 1从左往右数 " ( " 进行编号,自己的分组从1开始,group(0)代表匹配的目标整体
    # 2.(?:....):取消所属分组,()就是普通的括号,可以将里面的信息作为整体包裹,但不产生分组
    # regexp = re.compile ('(?:(?:http://)((.+))/)')  #( ) 转义成括号
    # target=regexp.match('http://(www.baidu,com)/')
    # print(target.group(0)) #http://(www.baidu,com)/ #将里面的信息作为整体包裹,但不产生分组
    # print(target.group(1)) #www.baidu,com
    
    # 替换:
    # 1.不参与匹配的原样带下  2 参与匹配的都会被替换为指定字符串
    # 3 在不指定字符串值 
    um拿到具体分组 4 其他字符串信息都是原样字符串
    # print(re.sub('《(?:[a-z]+)(d+)(.{2})',r'2abc21','《abc123你好》'))
    # 0:《abc  1:(123) 2:(你好) 》取不到不参与替换原样带下
    # 你好abc你好123》
    
    # print(re.sub('《(?:[a-z]+)(d+)(.{2})',r'12','《abc123你好》'))
    
    # print(re.findall('[a-z]{2}',r'123abcabce')) #['ab', 'ca', 'bc'] {n} n代表个数 a-z中的任意两个
    # ['ab', 'ca', 'bc']
    
    import re
    # print(re.findall('w','ab 12+-*&_'))  #['a', 'b', '1', '2', '_']
    # print(re.findall('W','ab 12+-*&_')) # [' ', '\', '+', '-', '*', '&']
    # print(re.findall('S','ab
    1
    2	+-*&_'))  #非空字符串
    # ['a', 'b', '1', '2', '\', '+', '-', '*', '&', '_']
    # print(re.findall('s','ab
    1
    2	+-*&_')) #匹配任意空字符串['
    ', '
    ', '	']
    # print(re.findall('d','ab
    1
    2	+-*&_')) #['1', '2']
    # print(re.findall('D','ab
    1
    2	+-*&_')) #任意非数字
    # ['a', 'b', '
    ', '
    ', '	', '\', '+', '-', '*', '&', '_']
    # print(re.findall('w_sb','egon alex_sb123123wxx_sb,lxx_sb')) # 字母数字下划线 ['x_sb', 'x_sb', 'x_sb']
    # print(re.findall('Aalex','abcalex is salexb'))  # 匹配字符串开始 []
    # print(re.findall('Aalex','alex is salexb'))  #匹配字符串开始 ['alex']
    # print(re.findall('^alex','alex is salexb')) #匹配字符串的开头 ['alex']
    # print(re.findall('sb','alexsb is sblalexbsb')) #匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串['sb']
    # print(re.findall('sb$','alexsb is sbalexbsb')) # 匹配字符串末尾['sb']
    # print(re.findall('^ebn$','ebn1')) #匹配开头 匹配结尾[]
    # print(re.findall('a
    c','a
    c a	c alc')) #['a
    c']
    
    # 重复匹配
    # . ? * + {m,n} .* .*?
    # 1  . 代表除了换行符外的任意一个字符
    # print(re.findall('a.c','abc alc aAc aaaaa
    c')) #['abc', 'alc', 'aAc']
    # print(re.findall('a.c','abc alc aAc aaaaca
    c',re.DOTALL))
    # ['abc', 'alc', 'aAc', 'aac', 'a
    c']
    # 2 ? 代表左边那一个字符重复0次或1次
    # print(re.findall('ab?','a ab abb abbb abbbbb'))  #['a', 'ab', 'ab', 'ab', 'ab']
    # 3 * 代表左边那一个字符出席那0次或无穷次
    # print(re.findall('ab*','a ab abb abbb abbbb')) #['a', 'ab', 'abb', 'abbb', 'abbbb']
    # 4 + 代表左边那一个字符出现1次或无穷次
    # print(re.findall('ab+','a ab abb abbba abbbbb'))  #['ab', 'abb', 'abbb', 'abbbbb']
    # 5 {m,n}:代表左边那一个字符出现m次到n次
    # print(re.findall('ab?','a ab abb abbbbb ')) #['a', 'ab', 'ab', 'ab']
    # print(re.findall('ab{0,1}','a ab abb abbbbb ')) #['a', 'ab', 'ab', 'ab']
    
    # print(re.findall('ab*','a ab abb abbb abbb abbbbb'))
    # ['a', 'ab', 'abb', 'abbb', 'abbb', 'abbbbb']
    # print(re.findall('ab{0,}','a ab abb abbb abbb abbbbb'))
    # ['a', 'ab', 'abb', 'abbb', 'abbb', 'abbbbb']
    
    # print(re.findall('ab+','a ab abb abbbb abbbb'))
    # ['ab', 'abb', 'abbbb', 'abbbb']
    # print(re.findall('ab{1,}','a ab abb abbbb abbbb'))
    # ['ab', 'abb', 'abbbb', 'abbbb']
    
    # print(re.findall('ab{1,3}','a ab abb abbb abbbbbb'))
    # ['ab', 'abb', 'abbb', 'abbb']
    
    # 6 .* 匹配任意长度, 任意的字符  =>贪婪匹配
    # print(re.findall('a.*c','ac a123c aaaac a*123)()c asdfdffdf'))
    # ['ac a123c aaaac a*123)()c']
    
    # 7 .*? :非贪婪匹配 {0,1}最少为零个中间值
    # print(re.findall('a.*?c',' ac a123c456c')) #['a123c']
    
    # ():分组
    # print(re.findall('(alex_sb)','alex_sb asdfgdsfdsfh_sb'))
    # ['alex'] 只返回匹配到的括号内的内容
    # print(re.findall(
    #     'herf="(.*?)"',
    #     '<li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li>'
    # ))
    # [] 最少0个
    
    # []:匹配一个指定返回内的字符(这一个字符来自于括号内定义的)
    # print(re.findall('a[0-9][0-9]c','alc a+c a2c a9c allc a-c acc aAc'))
    # []
    # 当需要被当众普通符号匹配时,只嗯能放到[]的最左边或最右边
    import re
    
    # print(re.findall('a[- + *]c', 'alc a+c a2c a9c a*c allc a-c acc aAc'))
    # ['a+c', 'a*c', 'a-c']
    # print(re.findall('a[a-zA-Z]c','alc a+c a2c a9c a*c allc a-c acc aAc'))
    # ['alc', 'acc', 'aAc']
    # []内的^代表取反的意思
    # print(re.findall('a[^a-zA-Z]c','alc a+c a2C a9c a*c allc a-c acc aAc'))
    # ['a+c', 'a9c', 'a*c', 'a-c']
    # print(re.findall('a[^0-9]c','a c alc a+c a2c a9c a*c allc a-c acc aAc'))
    # ['a c', 'alc', 'a+c', 'a*c', 'a-c', 'acc', 'aAc']
    # print(re.findall('([a-z]+)_sb','egon alex_sb123njjkjkjkjk_sb,lxx_sb'))
    # ['alex', 'njjkjkjkjk', 'lxx']
    
    # |: 或者
    # print(re.findall('compan(ies|y)','Too many companies have gone bankrupt,and the next one is my company'))
    # ['ies', 'y']
    # (?:) 代表取匹配成功的所有内容,而不是仅仅只是括号内的内容
    # print(re.findall('compan(?:ies|y)','Too many companies have gone bankrupt,and the next one is my company'))
    # ['companies', 'company']
    # print(re.findall('alex|sb','alex sb sb asjkjkjkgon alex sb egon'))
    # ['alex', 'sb', 'sb', 'alex', 'sb']
    
    # re模块的其他方法:
    # print(re.findall('alex|sb','123123 alex sb sfjdkklkgon alex sb egon '))
    # print(re.search('alex|sb','123123 alex sb sfjdkklkgon alex sb egon ').group())
    # print(re.search('^alex','123123 alex sb sfjdkklkgon alex sb egon '))
    # ['alex', 'sb', 'alex', 'sb'] 找所有的
    # alex   search 从左往右找到第一个就停下
    # None  从头开始匹配 不满足
    
    # print(re.search('^alex', 'alex sb sadfsadfasdfegon alex sb egon').group())
    # print(re.match('alex', '1alex sb sadfsadfasdfegon alex sb egon'))
    # alex 从头找 找到一个结束
    # None 相当于search的从头开始匹配 不满足
    # print(re.match('alex', 'alex sb sadfsadfasdfegon alex sb egon').group())
    # print(re.match('alex', 'alex sb sadfsadfasdfegon alex sb egon'))
    # alex 从头开始匹配 满足 group取值
    # <re.Match object; span=(0, 4), match='alex'> 从头开始匹配 满足
    # print(re.match('alex', '123213 alex sb sadfsadfasdfegon alex sb egon'))
    # None
    
    
    # info='a:b:c:d'
    # print(info.split(':'))
    # print(re.split(':',info))
    # ['a', 'b', 'c', 'd']
    # ['a', 'b', 'c', 'd']
    
    # info =r'get :a.txt3333/rwx'
    # print(re.split('[:\/]',info))
    # ['get ', 'a.txt', '3333', 'rwx']
    
    # print('egon is beutifull egon'.replace('egon','EGON',1))
    # EGON is beutifull egon
    # print(re.sub('(.*?)(egon)(.*?)(egon)(.*?)',r'123EGON5','123 egon is beauifull egon 123'))
    #             (123 )(egon)( is beutifull )(egon)( 123)
    # 123 egon is beauifull EGON 123
    
    
    # 123EGON5
    # print(re.sub('(lqz)(.*?)(SB)',r'321','lqz is SB'))
    # SB is lqz
    
    # print(re.sub('([a-zA-Z)]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)',r'52341',r'lqzzzzz123+ is SB'))
    # SB123+ is lqzzzzz
    
    # pattern =re.compile('alex')
    # print(pattern.findall('alex is alex alex'))
    # print(pattern.search('alex is alex alex').group())
    # print(pattern.match('alex is alex alex').group())
    # print(pattern.findall('alexfjksdjgkjskdfj is alex alex'))
    # ['alex', 'alex', 'alex']
    # alex
    # alex
    # ['alex', 'alex', 'alex']

    操作分组的方法

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

    返回值是math匹配的结果对象,可以 .group(组序号|组名)来取具体组的信息

    res=re.match('(d{3})(?P<center>d{3})(d{3})','123456789)

    print(res.group('center'))

    456

    # print(re.findall('d*', '<123456789>'))
    # ['', '123456789', '', '']  #先匹配< 后匹配123456789 在匹配> 最后匹配整体
    # 1、书写可以配身份证的正则表达式
    #   身份证:18位 由17位数字本体码和1位校验码组成排列顺序从左至右依次为:
    #   六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
    
    # [1-7][0-9]{5}  #六位数字地址码
    # (?:19[0-9]{2}|20[01][0-9])             #  1900-2019
    # (?:0[0-9]|1[12])                      #01-12 月
    # (?:0[0-9]|[12][0-9]|3[01])             #01-31 天
    # [0-9]{3}                              #三为数字顺序码
    # [0-9Xx]                            #一位验证码
    # [1-7][0-9]{5}(?:19[0-9]{2}|20[01][0-9])(?:0[0-9]|1[12])(?:0[0-9]|[12][0-9]|3[01])[0-9]{3}[0-9Xx]
    
    # 2 书写可以匹配邮箱的正则表达式
    # 2530302605@qq.com               .转义点把它当成普通的.匹配
    # [a-zA-Z0-9]w{,15}@[176|178|192].[com|com.cn|cn]
    
    # 获取百度首页图片地址
    import re
    import requests
    responds=requests.get('http://www.baidu.com/')
    print(responds)
    content=responds.text
    # print(content)
    content+='http://www.baidu.com/wimg/gs.gif'
    res1_list=re.findall('www[^w]*?(?:gif|png)',content)
    print(res1_list)
    # ['www.baidu.com/img/bd_logo1.png', 'www.baidu.com/bdorz/login.gif', 'www.baidu.com/bdorz/login.gif', 'www.baidu.com/img/gs.gif']
    res_list=re.findall('www.{1,30}(?:gif|png)',content)
    print(res_list)
    # ['www.baidu.com/img/bd_logo1.png', 'www.baidu.com/bdorz/login.gif', 'www.baidu.com/bdorz/login.gif', 'www.baidu.com/img/gs.gif', 'www.baidu.com/wimg/gs.gif']
    #
    小练习
  • 相关阅读:
    有关.net 框架的学习笔记
    简单定义工程架构
    respondsToSelector的相关使用
    IOS框架和服务
    iOS常用第三方类库
    ios换肤思想,及工具类
    集成激光推送
    远程推送
    ios本地推送
    UIPopoverController 的使用
  • 原文地址:https://www.cnblogs.com/lakei/p/10725004.html
Copyright © 2011-2022 走看看