[英]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.