如何以正确的方式写出以下带有特殊字符的数组?

How to write in the correct way the following array with special characters?

我想清理文件名,但只针对不允许的特殊字符:

char_not_supported_by_file_name = ['\', '/', ':', '*', '?', '"', '<', '>', '|']        
tmp_file_name= file

for c in char_not_supported_by_file_name:    
    if c in tmp_file_name:    
        tmp_file_name = tmp_file_name.replace(c, '_')

我试着写这个列表,检查我要清理的文件名是否有我不想要的 9 个特殊字符之一,并用下划线替换它,但我的 IDE 说数组写错了。怎样写才正确?

如果您在引号前加上反斜杠,它就会被转义。换句话说,它将是字符串中的一个字符,而不是标记字符串的结尾。您必须用另一个反斜杠转义第一个反斜杠:

char_not_supported_by_file_name = ['\', '/', ':', '*', '?', '"', '<', '>', '|']

此外,replace 如果找不到需要替换的字符的任何实例,则不会执行任何操作,因此您可以省略 if 检查:

for c in char_not_supported_by_file_name:
    tmp_file_name = tmp_file_name.replace(c, '_')

如果您熟悉正则表达式,可以使您的代码更简洁的方法是使用正则表达式而不是数组:

import re

tmp_file_name = file
tmp_file_name = re.sub(r'[\/:*?\"<>|]', '_', tmp_file_name)

这也解决了您原来的问题,即数组第一个元素 '\' 中的反斜杠正在转义结束引号并将其转换为 ' 文字而不是关闭反斜杠周围的引号。

如果你愿意导入模块,这可以不用循环来完成,使用 re.sub:

import re
file_name = "this/is:a*very?bad\example>of<a|filename"

res = re.sub("[\\/:*?\"<>|]", "_", file_name)
print(res)
# this_is_a_very_bad_example_of_a_filename

注意 \ 反斜杠需要三倍甚至四倍,具体取决于确切位置。阅读 及其副本以获取更多信息。原因是那些反斜杠被转义了两次:一次由解释器转义,然后一次由 re.