在 Python 中从字符串创建目录名称

create a directory name from a string in python

提问人:Just Me 提问时间:11/5/2023 最后编辑:VPfBJust Me 更新时间:11/6/2023 访问量:50

问:

将描述性字符串转换为可移植目录名称的最惯用、最干净的方法是什么?

类似的东西,但这也删除/替换了标点符号和其他空格,也许还有其他我没有想到的边缘情况。description.replace(" ", "_")

映射可能是有损的(你不需要能够重现原始字符串),它只需要是给定描述的合理近似值,当然 - 如果某处有一个标准实现,那将是一个很大的好处

谢谢!

例:"I'm thinking Avocado toast" -> "im_thinking_avocado_toast"

Python 文件系统

评论

0赞 VPfB 11/5/2023
除非输入始终是英文,否则第一步应该是 IMO this: stackoverflow.com/q/517923/5378816 .然后继续按照建议替换剩余的非 ascii-alphanum。
0赞 Codist 11/5/2023
你对 str.replace() 的使用不会替换除空格之外的任何内容
0赞 Just Me 11/5/2023
@Codist没错,这只是为了说明所需的修改类型,因此“但这也会删除/替换标点符号和其他空格......”

答:

0赞 Just Me 11/5/2023 #1

这个答案解释了如何用一个字符替换所有非字母数字字符,我想这已经足够了:

re.sub('[^0-9a-zA-Z]+', '_', description).lower()

In [6]: re.sub('[^0-9a-zA-Z]+', '_', "I'm thinking Avocado toast").lower()
Out[6]: 'i_m_thinking_avocado_toast'
0赞 Bibhav 11/5/2023 #2

逐步进行所有更改。对于这种情况,我建议使用正则表达式

import re

description = "I'm thinking Avocado toast!"
cleaned_description = re.sub(r'[^\w\s]', '', description)
cleaned_description = re.sub(r'\s+', '_', cleaned_description).lower()
print(cleaned_description)
0赞 gimix 11/6/2023 #3

为了获得最大的灵活性,您可以使用 构建一个转换表,并将其与 一起使用。假设您想将某些字符转换为下划线,将某些字符转换为连字符,而忽略其他一些字符。这就像这个(诚然相当愚蠢)的例子一样简单str.maketransstr.translate

trans = str.maketrans(" .()", "__--", "'/*")
"I'm thinking (Avocado) toast".translate(trans)

'Im_thinking_-Avocado-_toast'
0赞 Anton Norman 11/6/2023 #4

我能看到的最简单的解决方案,仅使用香草蟒蛇是这样的:

str = "I am thinking about Avocado Toast"
str_list = str.lower().split()
new_str = ""
for index, item in enumerate(str_list):
    new_str += item
    if index != len(str_list) - 1:
        new_str += "_"

这样做只是简单地在空白处拆分字符串,将其部分放在列表中,然后从其部分构造一个新字符串。in the loop 是检查是否已经到达终点,在这种情况下,不添加下线整体。if statement