Reg.sub 正则表达式帮助 Python 规范化 directory/file 与 Windows 一起玩
Reg.sub regex help in Python to normalize directory/file to play nice with Windows
这里很新,我正在尝试修改一些 python 代码以使用正则表达式规范化 Windows 的 directory/file 名称。我搜索并找到了很多代码示例,但还没有完全弄清楚如何将它们组合在一起。
这就是我想要完成的:
我需要删除所有无效的 Windows 字符,因此 directory/file 名称不包括:< > : " / \ | ? *
Windows 似乎也不喜欢 directory/file 名称末尾的空格。 Windows 也不喜欢目录名称末尾的句点。
所以,我需要在不影响扩展名的情况下去掉省略号。澄清一下,当我说省略号时,我指的是三个句号的模式,而不是单个 unicode 字符“水平省略号 (U+2026)”。我已经研究并找到了多种方法来完成其中的各个部分,但我无法将它们整合在一起并发挥出色。
return unicode(re.sub(r'[<>:"/\|?*]', "", filename)
这会清理名称,但不会清理两个或更多句点的模式。
return unicode(re.sub(r'[<>:"/\|?*.]', "", filename)
这会清理名称,但也会影响文件扩展名。
[^\w\-_\. ]
这似乎也是一个可行的选择。它的限制比必要的要多一些,但我确实发现继续添加我想忽略的特定字符很容易。
\.{2,}
这是我似乎无法与这些方法中的任何一种集成的部分。我知道这应该匹配两个或多个“.”,但留下一个“.”独自的。但是在某些情况下,我“可能”会在 Windows 目录名称的末尾留下一个句点,这是行不通的。
.*[.](?!mp3$)[^.]*$
我搜索并找到了这个特定的片段,它看起来很有希望 match/ignore 特定的扩展。就我而言,我希望 .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 命名限制,这些名称必须是 normalized/sanitized。
理想情况下,如果可以的话,我希望用一个 re.sub 来完成。
return unicode(re.sub(r'[<>:"/\|?*]', "", 文件名))
如果有 another/better 方法可以使此代码正常工作,我愿意接受。但由于我的理解有限,增加更多的复杂性超出了我的能力范围,所以我试图在我目前理解的范围内工作。这几天看了很多书,但还是没能完成我想做的事情。
例如:“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 的系统。”到 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.
所以我们开始(file/directory):
unicode(re.sub(r'(\<|\>|\:|\"|\/|\|\||\?|\*', '', file/directory))
解释:
\<|\>|\:|\"|\/|\|\||\?|\*
<= 匹配所有不需要的字符
此时您将删除所有不需要的字符 除了名称末尾的 spaces/dots 。
对于你的 file_name
你可以用
更新它的变量
file_name = re.sub(r'( +)$', '', file_name)
( +)$
<= 匹配字符串 结尾 处的空格或点。
你就完成了,因为除了名称末尾不能包含任何空格之外没有更多限制(记住我们已经删除了特殊字符)。
对于 目录 但是,您不能同时拥有 句点 和 空格.
因此,我认为最好的方法当然是实施 递归 过程,一旦停止 only when:
dir_name == re.sub(r'( +|\.+)$', '', dir_name)
和 dir_name
不断更新为 dir_name = re.sub(r'( +|\.+)$', '', dir_name)
而上面的语句是 false.
希望对你有帮助。
这里很新,我正在尝试修改一些 python 代码以使用正则表达式规范化 Windows 的 directory/file 名称。我搜索并找到了很多代码示例,但还没有完全弄清楚如何将它们组合在一起。
这就是我想要完成的:
我需要删除所有无效的 Windows 字符,因此 directory/file 名称不包括:< > : " / \ | ? * Windows 似乎也不喜欢 directory/file 名称末尾的空格。 Windows 也不喜欢目录名称末尾的句点。
所以,我需要在不影响扩展名的情况下去掉省略号。澄清一下,当我说省略号时,我指的是三个句号的模式,而不是单个 unicode 字符“水平省略号 (U+2026)”。我已经研究并找到了多种方法来完成其中的各个部分,但我无法将它们整合在一起并发挥出色。
return unicode(re.sub(r'[<>:"/\|?*]', "", filename)
这会清理名称,但不会清理两个或更多句点的模式。
return unicode(re.sub(r'[<>:"/\|?*.]', "", filename)
这会清理名称,但也会影响文件扩展名。
[^\w\-_\. ]
这似乎也是一个可行的选择。它的限制比必要的要多一些,但我确实发现继续添加我想忽略的特定字符很容易。
\.{2,}
这是我似乎无法与这些方法中的任何一种集成的部分。我知道这应该匹配两个或多个“.”,但留下一个“.”独自的。但是在某些情况下,我“可能”会在 Windows 目录名称的末尾留下一个句点,这是行不通的。
.*[.](?!mp3$)[^.]*$
我搜索并找到了这个特定的片段,它看起来很有希望 match/ignore 特定的扩展。就我而言,我希望 .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 命名限制,这些名称必须是 normalized/sanitized。
理想情况下,如果可以的话,我希望用一个 re.sub 来完成。 return unicode(re.sub(r'[<>:"/\|?*]', "", 文件名))
如果有 another/better 方法可以使此代码正常工作,我愿意接受。但由于我的理解有限,增加更多的复杂性超出了我的能力范围,所以我试图在我目前理解的范围内工作。这几天看了很多书,但还是没能完成我想做的事情。
例如:“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 的系统。”到 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.
所以我们开始(file/directory):
unicode(re.sub(r'(\<|\>|\:|\"|\/|\|\||\?|\*', '', file/directory))
解释:
\<|\>|\:|\"|\/|\|\||\?|\*
<= 匹配所有不需要的字符
此时您将删除所有不需要的字符 除了名称末尾的 spaces/dots 。
对于你的 file_name
你可以用
更新它的变量
file_name = re.sub(r'( +)$', '', file_name)
( +)$
<= 匹配字符串 结尾 处的空格或点。
你就完成了,因为除了名称末尾不能包含任何空格之外没有更多限制(记住我们已经删除了特殊字符)。
对于 目录 但是,您不能同时拥有 句点 和 空格.
因此,我认为最好的方法当然是实施 递归 过程,一旦停止 only when:
dir_name == re.sub(r'( +|\.+)$', '', dir_name)
和 dir_name
不断更新为 dir_name = re.sub(r'( +|\.+)$', '', dir_name)
而上面的语句是 false.
希望对你有帮助。