我有一堆文件:
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)')
非常感谢任何正确方向的帮助或步骤!
答案 0 :(得分:1)
只有正则表达式就在这里,不要采取错误的方式。我将解释如何修复代码以逐步重命名文件:
首先,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))