[英]Batch file rename: zero padding time with regex?
我有一整套文件(超過10.000個),這些文件名中包含日期和時間。 問題是日期和時間不是零填充的,從而導致排序問題。
文件名的格式為: output 5-11-2018 9h0m.xml
我想要的是以下格式: output 05-11-2018 09h00m.xml
我搜索了不同的解決方案,但大多數似乎都使用分割字符串然后重新組合它們。 這似乎很麻煩,因為在我的情況下,日,月,小時和分鍾需要分開,填充並重新組合。
我以為正則表達式可以為我提供更好的解決方案,但是我不太清楚。
我根據WiktorStribiżew的建議編輯了原始代碼,即您不能在替換中使用正則表達式,而應使用組:
import os
import glob
import re
old_format = 'output [1-9]-11-2018 [1-2]?[1-9]h[0-9]m.xml'
dir = r'D:\Gebruikers\<user>\Documents\datatest\'
old_pattern = re.compile(r'([1-9])-11-2018 ([1-2][1-9])h([0-9])m')
filelist = glob.glob(os.path.join(dir, old_format))
for file in filelist:
print file
newfile = re.sub(old_pattern, r'0\1-11-2018 \2h0\3m', file)
os.rename(file, newfile)
但這仍然不能完全按照我的意願運行,因為它不會更改小時數在10以下的時間。我還能嘗試什么?
您可以使用lambda表達式(作為替換參數傳遞給re.sub
方法.zfill(2)
在.zfill(2)
文件名中的數字。
另外,固定正則表達式模式以允許1或2位數字: (3[01]|[12][0-9]|0?[1-9])
表示日期, (2[0-3]|[10]?\\d)
一個小時(24h),和([0-5]?[0-9])
幾分鍾:
old_pattern = re.compile(r'\b(3[01]|[12][0-9]|0?[1-9])-11-2018 (2[0-3]|[10]?\d)h([0-5]?[0-9])m')
參見regex演示 。
然后使用:
for file in filelist:
newfile = re.sub(old_pattern, lambda x: '{}-11-2018 {}h{}m'.format(x.group(1).zfill(2), x.group(2).zfill(2), x.group(3).zfill(2)), file)
os.rename(file, newfile)
請參閱Python re.sub
docs:
如果repl是一個函數,則每次pattern的非重疊出現都會調用它。 該函數采用單個match對象參數,並返回替換字符串。
為了簡單起見,我建議使用old_pattern進行更通用的處理,假設您的文件名僅與數字不兼容:
因為匹配一個位數字段的文件名組合需要在任何位置進行轉換,但在其他字段中都是兩位數,則需要一個長的正則表達式來更明確地列出,所以我建議使用這種簡單得多的文件名來匹配要重命名的文件,這可以做個假設目錄中只有這種匹配類型的文件,因為它可以更廣泛地打開它,以便一目了然地編寫和讀取文件-在文件名中找到任何一位數字字段(一個或多個)-即。 非數字,數字,非數字:
old_format = r'output\\.*\\D\\d\\D.*\\.xml'
固定的re.sub語句可以是:
newfile = re.sub(r'\\D(\\d)[hm-]', lambda x: x.group()[0]+x.group()[1].zfill(2)+x.group()[2], file)
除非設置了適當的re module標志,否則這還將捕獲unicode非ASCII數字。
如果將年份(例如,2018年)僅指定為“ 18”,則需要對此進行特殊處理-可以是單獨的情況,還需要在re.sub regex模式集中添加一個空格(即[-hm ]
) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.