re模块:


#findall : 返回所有满足匹配条件的结果,放在列表里
     import re
     ret = re.findall('a', 'eva egon yuan')
     print(ret) #结果 : ['a', 'a']

#search : 只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
    ret = re.search('a', 'eva egon yuan').group()
    print(ret) #结果 : 'a'



# split 切割
     import re
     ret = re.split('d+','alex222wusir')
     print(ret)#['alex', 'wusir']
     ret = re.split('(d+)','alex222wusir')
     print(ret)#['alex', '222', 'wusir']
     ret = re.split('d(d)d','alex123wusir')
     print(ret)#['alex', '2', 'wusir']
#在匹配部分加上()之后所切出的结果是不同的,没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,这个在某些需要保留匹配部分的使用过程是非常重要的。

     ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
     print(ret)  # ['', '', 'cd']

        
# sub  替换
     ret = re.sub('d+','H','alex123wusir456')
     print(ret)#alexHwusirH
     ret = re.sub('d+','H','alex123wusir456',1)  #将数字替换成'H',参数1表示只替换1个
     print(ret)#alexHwusir456

        
# subn
     ret = re.subn('d+','H','alex123wusir456')  #将数字替换成'H',返回元组(替换的结果,替换了多少次)
     print(ret)#('alexHwusirH', 2)  返回一个元组,2表示替换了2次.


# match 在字符串开始处进行匹配,相当于在正则表达式前面人为的加上^,除此之外同search一样
     ret = re.match('d+','123eva456taibai')
     print(ret.group())#123
    
     ret = re.search('^d+','123eva456taibai')   #以d+开头的字符串
     print(ret.group())#123

    # 用户输入的内容匹配的时候,要求用户输入11位手机号码,^手机号正则表达式$,如^1[3-9]d{9}$
    
         ret = re.match('1[3-9]d{9}$','13854888888')  #match一般用来规定这个字符串必须是什么样的。解决检测一个输入的字符串是否合法的问题
         print(ret.group())#13854888888
         ret = re.search('^1[3-9]d{9}$','13854888888') #search一般用来寻找这个字符串中是不是含有满足条件的子内容。解决从一个大文件中找到符合规则的内容的问题
         print(ret.group())#13854888888

# compile --> 节省代码时间的工具
    # 假如同一个正则表达式要被使用多次,可以节省了多次解析同一个正则表达式的时间。
     ret = re.compile('d+')   #正则表达式可能很长,比如爬虫时
     res1 = ret.search('alex37176')
     print(res1.group())#37176
     res2 = ret.findall('alex37176')
     print(res2)#['37176']

     obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
     ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
     print(ret.group())  #结果 : 123

# finditer --> 节省空间。在结果的内容非常多的情况下使用,节省内存。得到的是迭代器,迭代器内是结果变量。结果变量通过.group取值。
    # findall 直接接返回列表,列表里是值
     ret = re.finditer('d+','agks1ak018093')  #字符串特别长,比如是一个大文件时
     for i in ret:
         print(i)
         print(i.group())
    #  <_sre.SRE_Match object; span=(4, 5), match='1'>
    #  1
    #  <_sre.SRE_Match object; span=(7, 13), match='018093'>
    #  018093

     import re
     ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
     print(ret)  # <callable_iterator object at 0x10195f940>
     print(next(ret).group())  #查看第一个结果 3
     print(next(ret).group())  #查看第二个结果 4
     print([i.group() for i in ret])  #查看剩余的左右结果  ['7', '8', '4']

#既节省时间,又节省空间: 先compile(如果没有重复使用同一个正则,也不能节省时间), 再finditer
     ret= re.compile('d+')
     res = ret.finditer('agks1ak018as093')
     for r in res:
         print(r.group())
     # 1
     # 018
     # 093


#1.功能
#2.性能
    # 时间上 :
        # 你要完成一个代码所需要执行的代码行数
        # 你在执行代码的过程中,底层程序是如何工作的
    # 空间上:
        # 是占用了宝贵的内存条资源
        # 影响程序的执行效率
#3. 用户体验



# 分组命名
    # (?P<名字>正则表达式)
    # ret.group('名字')

     import re
     ret = re.search('d(d)d(w+?)(d)(w)d(d)d(?P<name1>w+?)(d)(w)d(d)d(?P<name2>w+?)(d)(w)',
               '123abc45678agsf_123abc45678agsf123abc45678agsf')
     print(ret.group('name1'))#agsf_123abc
     print(ret.group('name2'))#agsf

# 分组命名的引用(引用分组):引用的是匹配到的内容,不是引用的正则表达式
     分组命名        (?P<组名>正则表达式)
     分组命名的引用  (?P=组名)
     有的时候我们要匹配的内容是包含在不想要的内容之中的,只能先把不想要的内容匹配出来,然后再想办法从结果中去掉

    
#匹配标签:

    #可以在分组中利用?<name>的形式给分组起名字,获取的匹配结果可以直接用group('名字')拿到对应的值
         import re
         ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
         print(ret.group('tag_name'))  #结果 :h1
         print(ret.group())  #结果 :<h1>hello</h1>

         import re
         exp= '<abc>akd7008&(&*)hgdwuih</abc>008&(&*)hgdwuih</abd>'  #标签
         ret= re.search('<(?P<tag>w+)>.*?</(?P=tag)>',exp)  # .*?非贪婪匹配
         print(ret)#<_sre.SRE_Match object; span=(0, 30), match='<abc>akd7008&(&*)hgdwuih</abc>'>
         print(ret.group('tag'))#abc   要加引号


    #如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致,获取的匹配结果可以直接用group(序号)拿到对应的值
        import re
        exp= '<abc>akd7008&(&*)hgdwuih</abc>008&(&*)hgdwuih</abd>'
        ret= re.search(r'<(w+)>.*?</1>',exp)  # r 表示取消在python字符串中所有的转义    在正则表达式中,1表示第一个分组
        ret= re.search('<(w+)>.*?</\1>',exp)  #\1 转义
        print(ret)

        ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>")
        print(ret.group(1))
        print(ret.group())  #结果 :<h1>hello</h1>



#匹配整数:
     import re
     ret=re.findall(r"d+.d+|d+","1-2*(60+(-40.35/5)-(-4*3))")
     print(ret)#['1', '2', '60', '40.35', '5', '4', '3']

     ret=re.findall(r"d+.d+|(d+)","1-2*(60+(-40.35/5)-(-4*3))") #要想得到整数,匹配整数或小数,只显示整数
     print(ret)#['1', '2', '60', '', '5', '4', '3']

     ret = re.findall(r"-?d+.d*|(-?d+)","1-2*(60+(-40.35/5)-(-4*3))")
     print(ret) #['1', '-2', '60', '', '5', '-4', '3']
     ret.remove("")
     print(ret) #['1', '-2', '60', '5', '-4', '3']


    #列表去除空元素(假如有多个),但不能改变顺序
     l = ['1', '2', '60', '', '5', '4', '3','','']
     for i in range(l.count('')):
         l.remove('') #默认删除从左数第一个
     print(l)#['1', '2', '60', '5', '4', '3']
    
     ret = filter(lambda n:n,l)
     print(list(ret))#['1', '2', '60', '5', '4', '3']
    
    
    
    #爬虫练习:
    import requests

    import re
    import json


    def getPage(url):
        response = requests.get(url)
        return response.text


    def parsePage(s):
        com = re.compile(
            '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
        ret = com.finditer(s)
        for i in ret:
            yield {
                "id": i.group("id"),
                "title": i.group("title"),
                "rating_num": i.group("rating_num"),
                "comment_num": i.group("comment_num"),
            }


    def main(num):
        url = 'https://movie.douban.com/top250?start=%s&filter=' % num
        response_html = getPage(url)
        ret = parsePage(response_html)
        f = open("move_info7", "a", encoding="utf8")
        for obj in ret:
            print(obj)
            data = json.dumps(obj, ensure_ascii=False)
            f.write(data + "n")


    if __name__ == '__main__':
        count = 0
        for i in range(10):
            main(count)
            count += 25






递归的定义——在一个函数里再调用这个函数本身
        count = 0
         def func():
             global count
             count += 1
             print(count)
             func()
             print(456)
         func()#RecursionError: maximum recursion depth exceeded while calling a Python object  报错


        # RecursionError

         python中递归的最大深度1000层 : 为了节省内存空间,不要让用户无限使用内存空间


        1.递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决
         2.循环和递归的关系

        # 递归不是万能的

        # 递归比起循环来说更占用内存

         3.修改递归的最大深度
             import sys
             sys.setrecursionlimit(100000)#将python允许的递归深度设置为了10w,至于实际可以达到的深度就取决于计算机的性能了

         4.递归函数 必须要停下来:

         一个递归函数要想结束,必须在函数内写一个return,并且return的条件必须是一个可达到的条件
        并不是函数中有return,return的结果就一定能够在调用函数的外层接收到

        # 如何递归4次结束整个函数?

         count = 0
         def func():
             global count
             count += 1
             print(count)
             if count == 4: return
             func()
             print(456)
         func()

        # 1
        # 2
        # 3
        # 4
        # 456
        # 456
        # 456

        def func(count):
            count += 1
            print(count)
            if count == 5 : return 5
            ret = func(count)
            print(count ,':',ret)
            return ret
        print('-->',func(1))

        # 2
        # 3
        # 4
        # 5
        # 4 : 5
        # 3 : 5
        # 2 : 5
        # --> 5

        def func(count):
            count += 1
            print(count)
            if count == 5 : return 5
            return func(count)
        print('-->',func(1))

        # 2
        # 3
        # 4
        # 5
        # --> 5



        # 练习:

        # 计算阶乘 100! = 100*99*98*97*96....*1

            #用循环 或者 递归
         def fin(n):
             if n ==1 :
                 return n
             else:
                 return n*fin(n-1)
         ret = fin(5)
         print(ret)#120



内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!