簡體   English   中英

批處理文件重命名:使用正則表達式的填充時間為零?

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

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