从字符串的开头删除子字符串

Gab*_*iel 1 python string substring

我有一个表示文件完整路径的字符串:

full_path = '/home/user/fold1/fold2/sub-fold/'
Run Code Online (Sandbox Code Playgroud)

我需要从这个字符串中删除它存储在不同变量中的根路径:

root = '/home/user/fold1/'
Run Code Online (Sandbox Code Playgroud)

因此,生成的路径应如下所示:

new_path = 'fold2/sub-fold/'
Run Code Online (Sandbox Code Playgroud)

当我的代码运行存储在许多不同位置的许多文件时,完整路径(显然根路径)不断变化.

这是我之后的(不存在的)操作:

new_path = full_path - root
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Apr*_*ion 5

对于路径操作,最好使用os.path:

import os
new_path = os.path.relpath(full_path, root)
Run Code Online (Sandbox Code Playgroud)

FTR:-字符串的运算符的等价物是string.replace(),但正如其他人所指出的,它将替换所有出现的字符串,而不仅仅是在开头:

new_path = full_path.replace(root, '')
Run Code Online (Sandbox Code Playgroud)

  • 使用`replace`不是一个好主意,因为它会在中间的某个地方替换root,这可能会导致问题,特别是当root只是''/'时. (4认同)

Alf*_*lfe 5

您可以删除与根的长度匹配的开头(bgoldst 的答案):

 path[len(root):]
Run Code Online (Sandbox Code Playgroud)

但是,您不会注意到该开头是否与您期望的根不匹配。例如,如果您有/bla/fooasroot/bar/zap/fong/tangas 文件,您将得到/fong/tang结果,有效地掩盖了前一个错误。我不建议这样做。

root正如评论指出的那样,严格替换给定的字符串path(Aprillion 的)也可以替换后来出现的字符串,从而有效地返回无意义的内容。

我建议正确替换字符串的开头:

import re

result = re.sub(r'^' + re.escape(root), '', path)
Run Code Online (Sandbox Code Playgroud)

这样你就可以避免这两个陷阱。

您可能还想考虑仅使用os.path.relpath()它根据文件系统逻辑从路径中剥离给定的开头。

在任何情况下,您都应该考虑在给定的根与路径的开头不匹配的情况下您的程序应如何运行。我提出的解决方案re将不会改变给定的路径。在大多数情况下,这将是一个有用的行为,但肯定不是在所有情况下。