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博文目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM