Python正则表达式re模块和os模块实现文件搜索模式匹配

☞ ░ 前往老猿Python博文目录

因测试需要,需要提供一个可以指定目录搜索符合条件的文件名函数,搜索时可以通过*(星号)匹配0-n个字符,?(问号)匹配任意1个字符,可以指定多个文件类型,每个类型采用分号分隔。

下面是利用正则表达式和os模块实现上面功能的一个函数getDirFiles:

def getDirFiles(directory,filenamelike,extnames=None):
    '''将文件搜索匹配规则转成正则匹配规则串,主要是*、?和.的处理
           *:匹配0或多个字符
           ?:匹配一个字符
           .:文件前缀、后缀分隔符
           directory:搜索目录
           filenamelike:文件名搜索模式,可以带*和?搜索
           extnames:限定文件名后缀范围,不同后缀分号分隔
           返回值:符合搜索条件的文件名列表
    '''
    import os
    import re

    searchpattern = None
    extnamesList = []
    def transFileMatchToReMatch(matchinf):
        reexprlist = []
        for ch in matchinf:
            if ch=='.':
                reexprlist.append('[.]{1}')
            elif ch=='*':
                reexprlist.append('(.)*')
            elif ch=='?':
                reexprlist.append('(.){1}')
            else:reexprlist.append(ch)
        pattern = ''.join(reexprlist)

        searchpat = re.compile(pattern,re.I)
        return searchpat



    def matchString(pattern,string):#判断指定字符串是否符合搜索
        nonlocal   searchpattern
        if not searchpattern:searchpattern = transFileMatchToReMatch(pattern)
        return re.fullmatch(searchpattern,string)


    if extnames:
        extnamesList = extnames.split(';')

    files = os.listdir(directory)
    filelist = []
    for file in files:
        if matchString(filenamelike,file):
            if extnames:
                filetype = file.rsplit(".",1)[1]
                if not filetype:continue
                if filetype not in extnamesList:continue
            #print(file)
            filelist.append(file)
    return filelist

测试执行:

>>> getDirFiles(r"f:\video","7*.*","mp4")
['7.mp4', '7.mp4_blurred.mp4']
>>> getDirFiles(r"f:\video","7*.*")
['7.mp4', '7.mp4_blurred.mp4']
>>> getDirFiles(r"f:\video","7*")
['7.mp4', '7.mp4_blurred.mp4', '7月业支会']
>>> getDirFiles(r"f:\video","7*.*","mp?")
[]
>>> getDirFiles(r"f:\video","7*.*","mp3")
[]
>>> getDirFiles(r"f:\video","*.*","mp3")
['audio.mp3']
>>> getDirFiles(r"f:\video","*.txt")
['test.txt', 'track.txt']
>>> getDirFiles(r"f:\video","*.*","txt;mp3")
['audio.mp3', 'test.txt', 'track.txt']
>>> 

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。

收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学5G!

☞ ░ 前往老猿Python博文目录

猜你喜欢

转载自blog.csdn.net/LaoYuanPython/article/details/108021133