繁体   English   中英

Python(3.5)-打开文件,名称的正则表达式部分,重命名-循环

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM