簡體   English   中英

Python(3.5)-打開文件,名稱的正則表達式部分,重命名-循環

[英]Python (3.5) - Open File, Regex part of name, Rename - Loop

我有一堆文件:

File Completed for 123456 1 - Platform Junk (AP .msg

File Completed for 1234566 1 - More Junk here and Stuf.msg

File Completed for 654321 1 - ® Stuff and Junk.msg

因此,每個文件都包含6或7位數字(不包括數字后的1 ),有些文件也具有愚蠢的R(注冊商標)符號。

我的目標是在當前目錄中搜索所有.msg文件,找到6或7位數字,然后將文件重命名為123456.msg或11234567.msg`。

我有應該正確工作的正則表達式來提取數字:

(?<!\\d)(\\d{6}|\\d{7})(?!\\d)

現在,我只需要遍歷所有.msg文件並重命名它們。 我已經開始使用以下代碼,但是我不太了解如何提取想要的內容並重命名:

for filename in glob.glob(script_dir + '*.msg'):
    new_name = re.sub(r'(?<!\d)(\d{6}|\d{7})(?!\d)')

任何幫助或朝着正確方向邁出的步伐將不勝感激!

只有正則表達式在這里,不要以錯誤的方式使用它。 我將逐步解釋如何修復代碼以重命名文件:

首先, glob模式應使用os.path.join編寫,否則您必須以/結束script_dir

for filename in glob.glob(os.path.join(script_dir,'*.msg')):

讓我們測試一下您的正則表達式,使其僅保留正則表達式匹配並刪除其余部分:

>>> re.sub(r".*((?<!\d)(\d{6}|\d{7})(?!\d)).*",r"\1.msg","File Completed for 1234566 1 - More Junk here and Stuf.msg")
'1234566.msg'

好的,既然可以了,那么就可以像下面這樣計算新名稱:

base_filename = os.path.basename(filename)
new_name = re.sub(r".*((?<!\d)(\d{6}|\d{7})(?!\d)).*",r"\1.msg",base_filename) # keep only matched pattern, restore .msg suffix in the end

因此正則表達式僅適用於文件名,不適用於完整路徑

最后,使用os.rename重命名文件(檢查是否已替換某些內容,否則重命名將失敗,因為source == dest:

if base_filename != new_name:
   os.rename(filename,os.path.join(script_dir,new_name))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM