python - Reg.sub 正则表达式帮助 Python 规范化目录/文件以与 Windows 良好配合

标签 python regex unicode substitution

这里非常新,我正在尝试修改一些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/

相关文章:

python - pandas DataFrame to_csv (python) 中的 CSV 方言

python - 对一个向量中的所有唯一对差异求和

带参数的 Python 列表过滤

c# - 重新格式化并构建一串连续数字

linux - 如何在嵌入式系统中存储德语文本?

Python 条件 XML 编写

visual-studio - visual studio 正则表达式查找/替换错误

javascript - 我在这个正则表达式中缺少什么?

javascript - Salesforce 自定义按钮返回“意外 token 非法?”

PHP - 在混合字符串中将 ASCII 转换为 Unicode