• doraemon的python 正则分组和循环实现递归


    ### 8.5 正则模块(re模块)
    
    - findall
    
    ```python
    ret = re.findall('d+','liujia123')
    #findall会匹配字符串中所有符合规则的项
    #并返回一个列表
    #如果未匹配到返回的就是一个空列表
    ```
    
    - search
    
    ```python
    ret = re.search('d+','liujia123')
    print(ret)
    if ret:
        print(ret,group())
    #会从头到尾从待匹配字符串中取出第一个符合条件的项
    #如果匹配到了,就返回一个对象,用group取值
    #如果没有匹配到,就返回None,不能用group
    ```
    
    - match
    
    ```python
    re = re.match('d+',"liujia123")
    print(ret)
    #会从头到尾匹配字符串中第一个字符是否符合规范
    #如果符合,就返回对象,用group取值
    #如果不符合,就返回None
    ```
    
    - finditer
    
    ```python
    ret = re.finditer('d+','liujia123'*20000) #ret是迭代器
    for i in ret:  #迭代出来的每一项都是一个对象
        print(i.group()) #通过group取值就行
    ```
    
    - compile
    
    ```python
    ret = re.compile('d+')  #用compile把正则规则提前绑定到ret中
    r1 = ret.reasch('liujia123')
    r2 = ret.findall('liujia123')
    r3 = ret.finditer('liujia123')
    for i in r3:
        print(i.group())
    ```
    
    - 分组
    
    ```python
    ret = re.split('d(d)','liu34jia345')
    #默认会保留分组中的内容
    ret = re.findall('d(d)','aa1alex83')
    # findall遇到正则表达式中的分组,会优先显示分组中的内容
    print(ret)
    ```
    
    
    
    - sub与subn
    
    ```python
    ret = re.sun('d','D','liu578jia56')
    #默认替换d匹配出来的所有数字
    ret = re.sun('d','D','liu578jia56',2)
    #后面的数字表示替换几个
    
    ret = re.subn('d','D','alex83wusir74taibai')
    print(ret)
    #('alexDDwusirDDtaibai', 4)
    #返回结果,并告诉替换了几次
    ```
    
    - split与字符串中的类似
    
    ```python
    ret = re.split('dd','liu34jia345')
    #['liu', 'jia', '5']
    ret = re.split('d(d)','liu34jia345')
    #默认会保留分组中的内容
    ```
    
    - 取消分组
    
    ```python
    ret = re.findall('d(?:.d+)?','1.234+2')
    print(ret)
    #因为有括号,所以会判定优先显示,?:可以取消分组
    ```
    
    ### 8.6 分组的概念与应用
    
    #### 8.6.1 分组的调用
    
    ```python
    s1 = '<h1>wahaha</h1>'
    s2 = '<a>wahaha ya wahaha</a>'
    import re
    ret = re.search('<(w+)>(.*?)</w+>',s1)
    print(ret)
    print(ret.group(0))   # group参数默认为0 表示取整个正则匹配的结果
    print(ret.group(1))   # 取第一个分组中的内容
    print(ret.group(2))   # 取第二个分组中的内容
    ```
    
    #### 8.6.2 分组的命名
    
    ```python
    s1 = '<h1>wahaha</h1>'
    s2 = '<a>wahaha ya wahaha</a>'
    import re
    ret = ret.search('<(?P<tag>w+)>(?P<content>.*?</w+>',s1)
    print(ret)
    print(ret.group('tag'))   # 取tag分组中的内容
    print(ret.group('cont'))   # 取cont分组中的内容
    
    
    ret = re.search('<(?P<tag>w+)>.*?</(?P=tag)>',s1)
     print(ret.group('tag'))
    (?P=组名) 表示这个组中的内容必须和之前已经存在的一组匹配到的内容完全一致
    ```
    
    ### 8.7 循环实现递归
    
    ```python
    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    lst = [menu]
    while lst:
        for key in lst[-1]:
            print(key)
        inp = input('>>>')   # 北京
        if inp.upper() == 'Q':break
        elif inp.upper() == 'B':lst.pop()
        elif lst[-1].get(inp):
            lst.append(lst[-1][inp])
    
    ```
    
    ```python
    #使用listdir求文件夹的大小
    import os
    lst = [r'D:code']
    size = 0
    while lst:
        path = lst.pop()
        name_lst = os.listdir(path)
        for name in name_lst:
            full_path = os.path.join(path,name)
            if os.path.isdir(full_path):
                lst.append(full_path)
            elif os.path.isfile(full_path):
                size += os.path.getsize(full_path)
    print(size)
    ```
  • 相关阅读:
    洛谷P3959 宝藏(状压dp)
    洛谷P3645 [APIO2015]雅加达的摩天楼(最短路+分块)
    洛谷P3646 [APIO2015]巴厘岛的雕塑(数位dp)
    洛谷P4770 [NOI2018]你的名字(后缀自动机+线段树)
    洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)
    hive3.1.1 hive-site.xml
    mysql 远程连接数据库的二种方法
    linux彻底干干净净完全卸载 mysql
    jdk环境变量配置
    Eclipse常用快捷键
  • 原文地址:https://www.cnblogs.com/doraemon548542/p/11317947.html
Copyright © 2020-2023  润新知