这里非常新,我正在尝试修改一些python代码以使用正则表达式为Windows标准化目录/文件名。我搜索并找到了很多代码示例,但还没有弄清楚如何将它们组合在一起。
这是我要完成的工作:
我需要删除所有无效的Windows字符,以便目录/文件名不包括:<>:“ / \ |?* Windows似乎也不喜欢目录/文件名末尾的空格。Windows也不如目录名称末尾的句点。
因此,我需要在不影响扩展名的情况下摆脱省略号。为了澄清,当我说省略号时,我指的是三个周期的模式,而不是单个Unicode字符“ Horizontal 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)
并且在上述声明为false时dir_name
不断更新。希望这对您有所帮助。dir_name = re.sub(r'( +|\.+)$', '', dir_name)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句