Python中的Reg.sub regex帮助可将目录/文件规范化以在Windows上正常播放

领主32

这里非常新,我正在尝试修改一些python代码以使用正则表达式为Windows标准化目录/文件名。我搜索并找到了很多代码示例,但还没有弄清楚如何将它们组合在一起。

这是我要完成的工作:

我需要删除所有无效的Windows字符,以便目录/文件名不包括:<>:“ / \ |?* Windows似乎也不喜欢目录/文件名末尾的空格。Windows也不如目录名称末尾的句点。

因此,我需要在不影响扩展名的情况下摆脱省略号。为了澄清,当我说省略号时,我指的是三个周期的模式,而不是单个Unicode字符“ Horizo​​ntal Ellipsis(U + 2026)”。我已经研究并发现了完成此过程各个部分的多种方法,但是我看不到将它们组合在一起并玩得很好。

return unicode(re.sub(r'[<>:"/\\|?*]', "", filename)

这将清除名称,但不会清除两个或多个句点的模式。

return unicode(re.sub(r'[<>:"/\\|?*.]', "", filename)

这将清理名称,但也会影响文件扩展名。

[^\w\-_\. ]

这似乎也是一个可行的选择。它比必要的要严格一些,但是我确实发现仅添加想要忽略的特定字符很容易。

\.{2,}

这是我似乎无法与任何这些方法集成的部分。我了解这应该与两个或多个“。”匹配,但要保留一个“。” 单独。但是在某些情况下,我“可能”在Windows目录名称的末尾留下一个句点,这不起作用。

.*[.](?!mp3$)[^.]*$

我搜索并找到了这个特定的代码段,它看起来很有希望匹配/忽略特定的扩展名。就我而言,我想让.mp3保留下来。也许有不同的处理方式。而且我认为这可以消除目录名称末尾带有句点的潜在问题。

感谢您的时间!

编辑:添加了附加信息


def normalize_filename(self, filename):
    """Remove invalid characters from filename"""
    return unicode(re.sub(r'[<>:"/\\|?*]', "", filename))

def get_outfile(self):
    """Returns output filename based on song information"""
    destination_dir = os.path.join(self.normalize_filename(self.info["AlbumArtist"]),
                                   self.normalize_filename(self.info["Album"]))
    filename = u"{TrackNumber:02d} - {Title}.mp3".format(**self.info)
    return os.path.join(destination_dir, self.normalize_filename(filename))

这是我要修改的相关代码。完整的代码基本上将歌曲艺术家,专辑和曲目说明从sqlite数据库文件中拉出。然后根据该信息创建艺术家目录,专辑目录和mp3文件。

但是,由于Windows命名限制,因此需要对这些名称进行规范化/清除。

理想情况下,如果可以的话,我希望使用一个re.sub来完成。返回unicode(re.sub(r'[<>:“ / \ |?*]',”“,文件名))

如果有另一种/更好的方法来使此代码起作用,我愿意接受。但是由于我的理解有限,增加更多的复杂性超出了我的范围,因此我试图在我目前所理解的范围内工作。过去几天,我已经做了大量的阅读工作,但还不能完全完成我想做的事情。

例如:“内德的原子垃圾箱\您正常吗?\不睡觉吗?”需要变成C:\内德的原子垃圾箱\您正常吗\不睡觉吗.mp3

另一个:“ Green Day \ UNO ... DOS ...TRÉ!\ F *** Time”需要变成C:\ Green Day \ UNO DOSTRÉ\ F Time.mp3”

另一个:“ Incubus \ A Curder的乌鸦……\ Pistola”将变成C:\ Incubus \ A Curder的乌鸦\ Pistola.mp3

棘手的示例:“ Down \ BYOB \ BYOB的系统到C:\ Down \ BYOB \ BYOB.mp3的系统” Windows不在乎它是BYOB,但是最后一个时期是引起问题的原因。因此,如果解决方案消除扩展名.mp3之外的所有“。”,则可能是最好的选择。

莱昂纳多·马菲

我的答案完全基于下面的文字(当然,您输入的是):

我需要删除所有无效的Windows字符,以便目录/文件名不包括:<>:“ / \ |?* Windows似乎也不喜欢目录/文件名末尾的空格。Windows也不如目录名称末尾的句点。

所以我们开始(对于文件/目录):
unicode(re.sub(r'(\<|\>|\:|\"|\/|\\|\||\?|\*', '', file/directory))

说明:
\<|\>|\:|\"|\/|\\|\||\?|\*<=匹配所有不想要的字符的alll

此时,除了名称末尾的空格/点外,您将擦除所有不需要的字符

对于您来说,file_name您可以使用
file_name = re.sub(r'( +)$', '', file_name)
( +)$<=匹配空格或字符串末尾来更新其变量
便会成功,因为除了名称的末尾不能包含任何空格之外,没有其他限制(请记住我们已经删除了特殊字符)。

但是,对于目录,不能同时包含句点 空格。
因此,我认为最好的方法当然是实施一个递归过程,该过程在以下情况下停止

dir_name == re.sub(r'( +|\.+)$', '', dir_name)

并且在上述声明为falsedir_name不断更新希望这对您有所帮助。dir_name = re.sub(r'( +|\.+)$', '', dir_name)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章