zoukankan      html  css  js  c++  java
  • 26 转义符 re模块 方法 random模块 collection模块的Counter方法

    主要内容 :

    1 . 正则表达式中的转义和 python中的转义符

      a: 正则表达式中的转义符

        '('  : 表示匹配小括号

        [() + * $ . ?]   在字符组中一些特殊的字符会现出原形.

        所有的d w s( t)  都表示原本的意义

        [-]只有写在字符组的首位的时候表示普通的减号,写在其他位置表示范围[1-9],如果想匹配减号[1-9]

      b: python中的转义符

        ' ' :表示转义符,赋予了n一个特别的意义  , 表示一个换行符

    print('C:
    ext')       #这个时候
    表示换行   C:   换行ext
    print(r'C:
    ext')      #这个时候加一个r就取消转义.
    

     2. re模块的方法

      a: findall  ,   search ,  match 

        findall  : 返回值类型 : 列表  ,如果没有匹配到结果,就返回一个空的列表

    import re
    res = re.findall('d+','serdd234asdwer89')
    print(res)
    # 参数 :          正则表达式,字符串
    #返回值类型 :     列表
    # 返回值的个数 :  1
    ret= re.findall('s+','serdd234asdwer89')
    print(ret)
    #如果没有匹配到结果,就返回一个空的列表
    

        serach  : 返回值类型: 正则匹配结果的对象,如果没有匹配到对象,返回none

    import re
    re1 = re.search('d+', 'qwert123yuiop789')
    print(re1)
    print(re1.group())
    #返回值类型 : 正则匹配结果的对象, 通过对象.group方法获取匹配到的第一个结果
    re2 = re.search('s', 'qwert123yuiop789')
    print(re2)         #
    print(re2.group())
    # 如果没有匹配到对象,就会返回none , 在再执行group会报错.
    

        match  : match只有在开始位置匹配成功的话,才有返回,如果不在开始位置匹配成功的话,就返回none

    import re
    re1 = re.match('d+','1234qwert123')
    print(re1)    #在这个时候match和search是一样的
    print(re1.group())
    re2 = re.match('d+','wertt24')
    print(re2)    #只检测re是不是在字符串的开始位置匹配,如果没有,返回none

      b: sub     ,    subn   ,  split

       sub : 参数: 正则表达式,  替换被取代的内容,还可以指定被替换的次数.

    import re
    re1 = re.sub('d+','12','12345sdf345er',1)
    #参数: 正则表达式, 替换被匹配的内容,还可以指定要替换的几次.
    

       subn:参数: 正则表达式,  替换被取代的内容 ; 返回值: 返回值是一个元祖,  可以显示替换的次数

    re2 = re.subn('d+','aa','3456ffff23')
    #参数: 正则表达式, 替换被取代的内容.
    # 返回值中显示替换的次数.
    print(re1)   #12sdf345er
    print(re2)   #('aaffffaa', 2)
    

         split : 切割,参数 : 正则表达式,字符串.返回值:是一个列表.

    import re
    re1 = re.split('d+','123der456yui789')
    # 参数 : 正则表达式,字符串
    #返回值: 列表
    print(re1)    #['', 'der', 'yui', '']

      c: complie   finditer   : 用于爬虫,自动化开发

         complie : 编译,节省时间 : 只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率

    import re
    re1 = re.compile('d+.d+')
    re2 = re1.search('12.34.456.5')
    print(re2)
    print(re2.group())
    

        finditer:  参数:正则表达式,  字符串 ;  返回的结果:  迭代器; 节省空间效率.

    import re
    re1 = re.finditer('d+.d+','12.34.456.5')
    print(re1)  #返回一个迭代器的对象
    for r in re1:               #r是正则匹配结果对象<_sre.SRE_Match object; span=(0, 5), match='12.34'>
        print(r.group())
    

    3. 当分组遇到findall , split , search

      findall:  会优先显示分组中的内容,要想取消分组优先,(?:正则表达式)

    import re
    re1 = re.findall('d+(.d+)?','wert32tig34.12er')      # 当分组遇到findall, 会显示分组里的内容.
    re2 = re.findall('d+(?:.d+)?','wert32tig34.12er')    #当在分组里加上?:可以取消只显示分组的内容,正常显示.
    print(re1)            #['', '.12']
    print(re2)            #['32', '34.12']
    

        一道题: 显示所有的整数

    # 显示所有的整数
    import re
    ret=re.findall(r"d+(?:.d+)|(d+)","1-2*(60+(-40.35/5)-(-4*3))")
    print(ret)                               ['', '', '', '.35', '', '', '']        
    ret.remove('')                           ['1', '2', '60', '', '5', '4', '3']
    print(ret)                               ['1', '2', '60', '5', '4', '3']

      split:  遇到分组 会保留分组内被切掉的内容

    import re
    re1 = re.split('d+(w)', '21asd为sffdf')   #根据21a切割, 保留分组里的内容
    print(re1)   #['','a', 'sd为sffdf']
    

      search:  如果search中有分组的话,通过group(n)就能够拿到group中的匹配的内容

    import re
    re1 = re.search('d+(.d+)(.d)','ser1.23.42.89wer')
    print(re1)
    print(re1.group())
    print(re1.group(1))
    print(re1.group(2))
    

        一道题:

    import re
    ret = re.search(r'<(w+)>(w+)</(w+)>',r'<a>wahaha</b>')
    print(ret.group())                #<a>wahaha</b>
    print(ret.group(1))               #a
    print(ret.group(2))               #wahaha
    print(ret.group(3))               #b

    4. 正则表达式的进阶: 分组命名

      分组命名(?P<name>正则表达式)      表示给分组起名字

      (?P=name):                     表示使用这个分组, 这里匹配到的内容应该和分组中的内容相同

    import re
    ret = re.search('(?P<name>w+)>w+</(?P=name)','<h1>hello</h1>')
    print(ret.group())          #h1>hello</h1
    print(ret.group('name'))   #h1

      通过索引使用分组:          1 表示使用第一组匹配到的内容必须和第一组中的内容完全相同.

    import re
    ret = re.search(r'<(w+)>w+</1>','<h1>hello</h1>')
    print(ret.group(1))          #h1
    print(ret.group())         #h1>hello</h1
    

    5. random模块   

      随机: 在某个范围内取到每一个值得概率是相等的

      a : 随机小数

        random.random()             0-1之内的随机小数

    import random
    print(random.random())       #0.45057792992073786

        random.uniform(1,5)        任意范围之内的随机小数  

    import random
    print(random.uniform(1,5))    #1.0981749595009709

      b: 随机整数

        random.randint(1,3)             [1,3] 包含3在内的范围内随机取整数

    import random
    print(random.randint(1,9))   #1-9之间随意取

        random.randrange(1,3)        [1,3)不包含3在内的范围内随机取整数

        random.randrange(1,20,2)   [1,20]20之内的范围内随机取奇数

    import random
    print(random.randrange(1,20,2))   #1-20之间随意奇数

      c: 随机抽取

        随机抽取一个值 : random.choice(lst)

    import random
    lst = [1,2,'aa',(1,3,'qq')]
    print(random.choice(lst))

        随机抽取多个值 : random.sample(lst)

    import random
    lst = [1,2,'aa',(1,3,'qq')]
    print(random.sample(lst,3))  #返回值是一个来列表

      d: 打乱顺序

        再原列表的基础上做乱序  random.shuffle(lst)

    import random
    lst = [1,2,'aa',(1,3,'qq')]
    random.shuffle(lst)  #没有返回值
    print(lst)
    

        e : 随机模块的应用:

        版本1: 纯数字的验证码:

    def rand_code(n=4):
        code = ''
        for i in range(n):
            num = random.randint(0,9)
            code += str(num)
        return code
    
    print(rand_code())
    print(rand_code(6))
    

        版本2: 包含数字和字母的验证码:

    def rand_code(n=6):
        code = ''
        for i in range(n):
            rand_num = str(random.randint(0,9))
            rand_alph = chr(random.randint(97,122))
            rand_alph_upper = chr(random.randint(65,90))
            atom_code = random.choice([rand_num,rand_alph,rand_alph_upper])
            code += atom_code
        return code
    
    ret = rand_code()
    print(ret)
    

            版本3 : 数字/数字和字母的验证码:

    def rand_code(n=6 , alph_flag = True):
        code = ''
        for i in range(n):
            rand_num = str(random.randint(0,9))
            if alph_flag:
                rand_alph = chr(random.randint(97,122))
                rand_alph_upper = chr(random.randint(65,90))
                rand_num = random.choice([rand_num,rand_alph,rand_alph_upper])
            code += rand_num
        return code
    
    ret = rand_code(n = 4)
    print(ret)
    

    6 collection模块

      1) Counter方法:  https://www.cnblogs.com/keke-xiaoxiami/p/8553076.html

        Counter目的是用来跟踪出现的次数. 它是一个无序的容器类型, 以字典的键值对形式存储,其中元素作为key,计数的值作为value. 计数值可以是任意的整数.

      创建counter类的四种方法:

        

    c = Counter()  # 创建一个空的Counter类
    c1 = Counter('gallahad')  # 从一个可iterable对象(list、tuple、dict、字符串等)创建
    c2 = Counter({'a': 4, 'b': 2})  # 从一个字典对象创建
    c3 = Counter(a=4, b=2)  # 从一组键值对创建
    print(c,c1,c2,c3)
    #Counter()
    #Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
    #Counter({'a': 4, 'b': 2})
    # Counter({'a': 4, 'b': 2})
    

      

     

        

        

  • 相关阅读:
    OAuth2.0协议流程
    记多个微服务同时被kill分析
    记一次调用API遇到的问题
    win10安装mysql遇到的坑
    nagios
    rmp安装mysql5.6
    桥接模式-xshell连接虚拟机
    VMWare虚拟机-网络适配器
    ***时间目录***
    docker常用命令
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9438555.html
Copyright © 2011-2022 走看看