繁体   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