从目录中删除反斜杠& Python的文件

时间:2014-07-08 19:51:03

标签: python regex path

我的代码类似于:

chars = ['~', '*', '\\', ':', '<', '>', '|', '?', '"']

def ReplaceChars(value):
    for c in chars:
        value = value.replace(c, '')
    return value


def RenamePath(root, path):
    newFilePath = ReplaceChars(path)
    os.rename(os.path.join(root, path), os.path.join(root, newFilePath))


def WalkFileSystem(dirroot):
    # Main Walk Through File System
    for root, dirs, files in os.walk(dirroot, topdown=False):

    for name in dirs:
        searchObj = re.search(r'[%s]' % ''.join(chars), name)
        if searchObj:
            RenamePath(root, name)

    for name in files:
        searchObj = re.search(r'[%s]' % ''.join(chars), name)
        if searchObj:
            RenamePath(root, name)

问题是如果目录或文件包含反斜杠,它将无法将其删除。通过删除r我不再将其视为原始字符串而是使用四个反斜杠,正则表达式模式需要两个反斜杠。正如我所期望的那样,正则表达式模式出现在第一个arg中,并且搜索会将其选中。它只是不会从路径字符串中删除反斜杠,我不知道为什么。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

原始字符串在r'[%s]' % ''.join(chars)插值中没有做任何有用的事情,它首先得到评估,不会逃避任何事情,然后chars被连接和替换。所以它与执行'[%s]' % ''.join(chars)相同。

此处\的问题在于您需要'\\\\'(或r'\\')进行正则表达式,'\\'进行替换。正则表达式需要一个更多级别的转义,因此您不能对两者使用相同的字符串:

>>> path = 'a\\path'
>>> re.search('[\\\\]', path)
<_sre.SRE_Match object at 0x10d5c6920>
>>> path = 'a\\path'
>>> path.replace('\\\\', '')
'a\\path'
>>> path.replace('\\', '')
'apath'

您可以使用单独的chars数组进行搜索和替换:

chars_search = ['~', '*', '\\\\', ':', '<', '>', '|', '?', '"']
chars_replace = ['~', '*', '\\', ':', '<', '>', '|', '?', '"']

或将其全部合二为一:

chars = ['~', '*', '\\\\', '\\', ':', '<', '>', '|', '?', '"']

最适合你的。

答案 1 :(得分:0)

答案:'[%s]' % ''.join(chars).encode('string_escape')

您可以使用此解决方案或由famousgarkin提供的解决方案。哪个适合您的需求


因此,经过大量的调查和测试,我发现你的原始字符串命令

r'[%s]' % ''.join(chars)

没有做你想要的。您可以通过运行以下命令在Python控制台中对此进行测试:

命令:r'[%s]' % ''.join(chars)r'[~*\\:<>|?"]'

输出:'[~*\\:<>|?"]''[~*\\\\:<>|?"]'

希望这适合你。

解释为什么原始字符串不起作用

以下两个命令的输入/输出如下:

输入:r''.join(chars)r'\\'.join(chars)

输出:~*\\:<>|?"~\\\\*\\\\\\\\\\:\\\\<\\\\>\\\\|\\\\?\\\\"

我试图用这些输出来证明原始字符串符号仅应用于直接连接到它的字符串,而不是之后的任何其他内容。基本上,原始字符串将r''解释为'',将r'\\'解释为'\\\\'。然后它应用其他一切。如果你看第二个输出,你会看到在星号后面有四个反斜杠(应该是),但是总共有6个反斜杠。这意味着在没有原始字符串转换的情况下读入\\列表中的chars,然后是连接的四个反斜杠。

再次,希望这会有所帮助。