re模块拾遗和递归函数

一、re模块拾遗

  • split:以匹配的字符为截短(加上分组可以显示分组内容)

    import re
    ret = re.split('d+','alex222wusir')
    print(ret)
    # 输出
    ['alex', 'wusir']
    ----------------------------------------
    import re
    # 加上分组会显示分组的内容
    ret = re.split('d(d)d', 'alex123wusir')
    print(ret)
    # 输出
    ['alex', '2', 'wusir']
  • sub('匹配需要替换内容表达式','替换的新内容',替换次数):替换匹配到的内容

    import re
    ret = re.sub('d+','HH','aa33bb44cc')
    print(ret)
    # 输出
    aaHHbbHHcc
    --------------------------------------
    import re
    ret = re.sub('d+','HH','aa33bb44cc',1) # 替换1次
    print(ret)
    # 输出
    aaHHbb44cc
  • subn:和sub一样,不过以元组的形式返回替换之后的的内容和替换的次数

    import re
    ret = re.subn('d+','H','aa33bb44cc')
    print(ret)
    # 输出
    ('aaHbbHcc', 2)
  • match:在表达式之前默认加了个 ^ 元字符(匹配以什么开头)

    import re
    # 表达式相当于='^d+'匹配任意一个或多个数字开头的字符
    ret = re.match('d+','1234abcd567')  
    print(ret.group())
    # 输出
    1234
  • compile:节省代码时间的工具,没有重复使用同一个正则,也不能节省时间。

    • 假如同一个正则表达式要被多次使用

    • 节省了多次解析同一个正则表达式的时间

    import re
    ret = re.compile('d+')
    res1 = ret.search('abcd1234')
    res2 = ret.findall('abcd1234')
    print(res1)
    print(res2)
    # 输出
    <re.Match object; span=(4, 8), match='1234'>
    ['1234']
  • finditer:返回的是一个迭代器,为了节省空间

    import re
    ret = re.finditer('d+','agks1ak018093')
    print(ret)              # 是一个迭代器
    for i in ret:           # 把匹配出来的结果循环出来,节省了空间的占用
        print(i.group())
    # 输出
    <callable_iterator object at 0x00000204E6721E20>
    1
    018093

二、分组命名

  • 标准格式

    (?P<组名>正则表达式)
  • 有的时候我们要匹配的内容是包含在不想要的内容之中的

    • 只能先把不想要的内容匹配出来,然后再想办法从结果中去掉

import re
exp = '2014-9-23和1999-04-30'
ret = re.search(r"[1-9]d{3}-(?P<month>[1][0-2]|0?[1-9])-(?P<date>[[1-2][0-9]|[3][01]|0?[1-9])", exp)
​
print(ret.group())
print(ret.group('month'))
print(ret.group('date'))
# 输出
2014-9-23
9
23

三、递归函数

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

每次递归会新开辟一个临时名称空间随着函数的结束而清除,而递归函数是自己调用自己,就会不断的重复开辟新空间占用内存,而又不结束之前的空间。

count = 0
def func():
    global count
    count += 1
    print(count)
    func()
func()
  1. 递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决

  2. 循环和递归的关系

    • 递归不是万能的

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

  3. 修改递归的最大深度

    import sys
    sys.setrecursionlimit(100000)       # 修改递归深度,会根据电脑的性能来做适当的结束

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

函数的每层调用自己到为递,结束后的返回值为归

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       # 第四层条件满足,并把 5 返回给第三层并结束第四层的函数                      -->归
4 : 5   # 第三层,并把返回的值返回给上一层函数并结束第三层函数, 5 为第四层函数的返回值  -->归
3 : 5   # 第二层,把第三层返回的值在返回给第一层并结束                              -->归
2 : 5   # 第一层,获取第二层的返回值并返回给调用者                                 -->归
--> 5

四、递归函数练习

  1. 计算阶乘

    def factorial(count):
        if count == 1:
            return count
        return factorial(count-1) * count
  2. os模块:查看一个文件夹下的所有文件,这个文件夹下面还有文件夹,不能用walk

    import os
    ​
    c = os.path.dirname(__file__)  # 当前文件父目录 练习
    def show_file(path):
        name_lst = os.listdir(path)
        for name in name_lst:
            abs_path = os.path.join(path, name)
            if os.path.isfile(abs_path):
                print(name)
            elif os.path.isdir(abs_path):
                show_file(abs_path)
    ​
    show_file(c)
  3. 计算斐波那契数列第10个数:1 1 2 3 5 8 13 21 34 55

    def bonacci_sequence(count):
        if count == 1 or count ==2:
            return 1
        else:
            return bonacci_sequence(count-1)+bonacci_sequence(count-2)
    ​
    print(bonacci_sequence(10))
    # 输出
    55
  4. 三级菜单 可能是n级

    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    def threeLM(dic):
        while True:
            for k in dic: print(k)
            key = input('input>>').strip()
            if key == 'b' or key == 'q':
                return key
            elif key in dic.keys() and dic[key]:
                ret = threeLM(dic[key])
                if ret == 'q': return 'q'
    ​
    threeLM(menu)
学习之旅
原文地址:https://www.cnblogs.com/XiaoYang-sir/p/14714877.html