这里非常新,我正在尝试修改一些Python代码以使用正则表达式规范Windows的目录/文件名。我搜索并找到了很多代码示例,但还没有完全弄清楚如何将它们组合在一起。
这就是我想要实现的目标:
我需要删除所有无效的 Windows 字符,以便目录/文件名不包括:< > : "/\| ? * Windows 似乎也不喜欢目录/文件名末尾有空格。 Windows 也不喜欢在目录名称末尾添加句点。
所以,我需要在不影响扩展的情况下去掉省略号。澄清一下,当我说省略号时,我指的是三个句点的模式,而不是单个 unicode 字符“水平省略号 (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 来完成此操作。 return unicode(re.sub(r'[<>:"/\|?*]', "", 文件名))
如果有另一种/更好的方法使该代码正常工作,我对此持开放态度。但由于我的理解有限,增加更多的复杂性超出了我的能力范围,所以我试图在我目前理解的范围内工作。这几天我读了很多书,但还没有完全完成我想做的事情。
例如:“Ned's Atomic Dustbin\ARE YOU NORMAL?\Not Sleeping around”需要变为 C:\Ned's Atomic Dustbin\ARE YOU NORMAL\Not Sleeping around.mp3
另一个:“Green Day\UNO...DOS...TRÉ!\F*** Time”需要变成C:\Green Day\UNO DOS TRÉ\F Time.mp3”
另一个:“Incubus\A Crow Left Of The Murder...\Pistola”将变成 C:\Incubus\A Crow Left Of The Murder\Pistola.mp3
棘手的例子:“系统A Down\B.Y.O.B.\B.Y.O.B.” to C:\System Of A Down\BYOB\BYOB.mp3” Windows 不会关心它是否是 B.Y.O.B,但最后一个句点才是导致问题的原因。因此,最好的解决方案是消除所有“.”(扩展名 .mp3 除外)。
最佳答案
我的答案完全基于以下文本(当然是您输入的):
I need to remove all invalid Windows characters so directory/file names do not include: < > : " / \ | ? * Windows also doesn’t seem to like spaces at the end of a directory/file name. Windows also doesn’t like periods at the end of directory names.
所以我们开始(对于文件/目录):
unicode(re.sub(r'(\<|\>|\:|\"|\/|\\|\||\?|\*', '', file/directory))
说明:
\<|\>|\:|\"|\/|\\|\||\?|\*
<= 匹配所有不需要的字符
此时,您将删除所有不需要的字符除了名称末尾的空格/点。
给你的file_name
您可以使用
更新其变量
file_name = re.sub(r'( +)$', '', file_name)
( +)$
<= 匹配字符串末尾处的空格或点。
你就完成了,因为除了名称末尾不能包含任何空格之外,没有更多的限制(记住我们已经删除了特殊字符)。
但是,对于目录,不能同时具有句点和空格。
因此,我认为最好的方法当然是实现一个递归过程,一旦停止仅时:
dir_name == re.sub(r'( +|\.+)$', '', dir_name)
和dir_name
持续更新 dir_name = re.sub(r'( +|\.+)$', '', dir_name)
而上述说法是错误。
希望这对您有帮助。
关于python - Reg.sub 正则表达式帮助 Python 规范化目录/文件以与 Windows 良好配合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49163663/