zoukankan      html  css  js  c++  java
  • fnmatch:Unix式glob模式匹配,简单场景下可以代替正则

    介绍

    fnmatch是模块用来匹配(通过glob模式、如Unix shell所使用的的模式)文件名的

    简单匹配

    import fnmatch
    
    '''
    fnmatch将一个文件名与一个模式进行比较,并返回一个布尔值,指示二者是否匹配。
    
    ?:匹配一个任意字符
    *:匹配任意个任意字符
    [sequence]:匹配出现在sequence里面的一个字符
    [!sequence]:匹配没有出现在sequence里面的一个字符
    [a-m]:匹配出现在abcdef...m中的字符
    [A-M]:匹配出现在ABCDEF...M中的字符
    [0-9]:匹配出现在0123...9中的字符
    '''
    # 虽说是用来匹配文件名的,但是我们匹配普通的字符串也是可以的
    # 注意返回的是一个bool值
    print(fnmatch.fnmatch("abcde", "*"))  # True
    print(fnmatch.fnmatch("abcde", "abc?"))  # False
    print(fnmatch.fnmatch("abcde", "abc??"))  # True
    print(fnmatch.fnmatch("abcde", "[a-z]????"))  # True
    print(fnmatch.fnmatch("aaa", "aaa*"))  # True
    print(fnmatch.fnmatch("1ab", "[0-1]??"))  # True
    
    # 注意fnmatch默认是大小写不敏感的
    print(fnmatch.fnmatch("Aaa", "aaa"))  # True
    # 如果我想区分大小写呢?可以使用fnmatchcase
    print(fnmatch.fnmatchcase("Aaa", "aaa"))  # False
    
    import os
    
    for name in os.listdir(r"C:python37Libasyncio"):
        if fnmatch.fnmatch(name, "base_*.py"):
            print(name)
    '''
    base_events.py
    base_futures.py
    base_subprocess.py
    base_tasks.py
    '''
    

    过滤

    import fnmatch
    import os
    from pprint import pprint
     
     
    '''
    要测试一个文件名序列,可以使用filter,会返回与模式参数匹配的文件名列表
    '''
    f = os.listdir(r"C:python37Libasyncio")
    pprint(f)
    '''
    ['base_events.py',
     'base_futures.py',
     'base_subprocess.py',
     'base_tasks.py',
     'constants.py',
     'coroutines.py',
     'events.py',
     'format_helpers.py',
     'futures.py',
     'locks.py',
     'log.py',
     'proactor_events.py',
     'protocols.py',
     'queues.py',
     'runners.py',
     'selector_events.py',
     'sslproto.py',
     'streams.py',
     'subprocess.py',
     'tasks.py',
     'transports.py',
     'unix_events.py',
     'windows_events.py',
     'windows_utils.py',
     '__init__.py',
     '__pycache__']
    '''
    print(fnmatch.filter(f, "base_*.py"))
    '''
    ['base_events.py', 'base_futures.py', 'base_subprocess.py', 'base_tasks.py']
    '''
    

    转换模式

    import fnmatch
     
     
    '''
    在内部,fnmatch将glob模式转换为一个正则表达式,并使用re模块比较文件名和模式。
    translate函数是将glob模式转换为正则表达式的公共API
    '''
    pattern = "base_*.py"
    print(fnmatch.translate(pattern))  # (?s:base_.*.py)
    
  • 相关阅读:
    (算法)堆与堆排序
    (笔试题)N!的三进制数尾部0的个数
    (笔试题)N!尾部连续0的个数
    程序员与编程一些鲜为人知的事实 软件遵循熵的定律
    关注职业发展,也要关注健康 别让老板杀了你
    其实,最好的年龄才刚刚开始
    你为什么就做不到呢? 正确的选择改变命运
    睡觉前为啥总是忍不住刷网页刷手机?
    中年程序员职业生涯另一选择:创业追寻自己的热情所在
    都很好的两人为何却没有好的婚姻 清楚对方的需要
  • 原文地址:https://www.cnblogs.com/traditional/p/11874545.html
Copyright © 2011-2022 走看看