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

Python 从字符串的开头删除子字符串,python,string,substring,Python,String,Substring,我有一个字符串,表示文件的完整路径: full_path = '/home/user/fold1/fold2/sub-fold/' 我需要从这个字符串中删除存储在不同变量中的根路径: root = '/home/user/fold1/' 因此,生成的路径应如下所示: new_path = 'fold2/sub-fold/' 当我的代码在许多不同位置存储的文件中运行时,完整路径和根路径都在不断变化 这是我要找的不存在的行动: new_path = full_path - root 如何执行

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

full_path = '/home/user/fold1/fold2/sub-fold/'
我需要从这个字符串中删除存储在不同变量中的根路径:

root = '/home/user/fold1/'
因此,生成的路径应如下所示:

new_path = 'fold2/sub-fold/'
当我的代码在许多不同位置存储的文件中运行时,完整路径和根路径都在不断变化

这是我要找的不存在的行动:

new_path = full_path - root

如何执行此操作?

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

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


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

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


如果您相信完整路径确实以root开头,则可以按索引使用一个简单的子字符串:

new_path = full_path[len(root):]

如果您不信任它,可以先进行If测试以进行检查,如果不符合预期,则采取适当的措施。

如果您相信完整路径确实以根开始,则可以使用简单的子字符串(按索引):

new_path = full_path[len(root):]

如果您不信任它,可以先进行If测试以进行检查,如果不符合预期,则采取适当的措施。

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

 path[len(root):]
但是,如果开始与预期的根不匹配,您将不会注意到。例如,如果您将/bla/foo作为根目录,将/bar/zap/fong/tang作为文件,那么您将得到/fong/tang,从而有效地掩盖了前一个bug。我不建议这样做

正如评论所指出的那样,严格地替换给定路径中的字符串根也可以替换以后出现的字符串根,从而有效地返回废话

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

import re

result = re.sub(r'^' + re.escape(root), '', path)
这样可以避免两个陷阱

您可能还想考虑使用OS.PAT.RelPATH,它根据文件系统逻辑从一条路径中剥离给定的开始。


无论如何,在给定根与路径的起始不匹配的情况下,你应该考虑你的程序应该如何运行。我提出的重新解决方案不会改变给定的路径。在大多数情况下,这将是一个有用的行为,但肯定不是在所有情况下。

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

 path[len(root):]
但是,如果开始与预期的根不匹配,您将不会注意到。例如,如果您将/bla/foo作为根目录,将/bar/zap/fong/tang作为文件,那么您将得到/fong/tang,从而有效地掩盖了前一个bug。我不建议这样做

正如评论所指出的那样,严格地替换给定路径中的字符串根也可以替换以后出现的字符串根,从而有效地返回废话

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

import re

result = re.sub(r'^' + re.escape(root), '', path)
这样可以避免两个陷阱

您可能还想考虑使用OS.PAT.RelPATH,它根据文件系统逻辑从一条路径中剥离给定的开始。


无论如何,在给定根与路径的起始不匹配的情况下,你应该考虑你的程序应该如何运行。我提出的重新解决方案不会改变给定的路径。在大多数情况下,这将是一种有用的行为,但在所有情况下当然都不是。

FulthPaul.RePosioRoT,Full Purth.RePosioRoT,使用替换不是一个好主意,因为它也会在中间的某个地方替换根,这会导致问题,特别是当根只是'/'时,使用替换不是一个好主意,因为它也会在中间的某个地方替换根,这会导致问题,尤其是当根只是'/'时。这会掩盖可能的错误,即路径的开始不应该匹配根。不,这不会掩盖错误。我明确地用“如果您相信完整路径确实以root开头”来限定我的答案,并指出如果您不信任它,您需要检查它。程序员总是信任变量,这是有充分理由的。如果我们不这样做,我们的代码将充斥着不必要和浪费的检查,我们将无法完成任何工作。是的,没错。我只是不想在一个好的解决方案之前发布一个优化的解决方案。一个优化的解决方案是一个好的解决方案。对不起,我不同意这一点,事实上我非常强烈。在我看来,一个像样的解决方案是,下一个开发人员也将能够立即阅读和理解所有后果,而无需阅读一些说明更模糊的后果的文档。一个优化的解决方案可能缺少这些特性,而不利于速度或内存消耗。至少,我一开始就是这么说“体面”这个词的。如果我对这个词的使用有误导性,我道歉。这将掩盖可能出现的错误
路径不匹配,因为它应该与根匹配。不,这不会掩盖错误。我明确地用“如果您相信完整路径确实以root开头”来限定我的答案,并指出如果您不信任它,您需要检查它。程序员总是信任变量,这是有充分理由的。如果我们不这样做,我们的代码将充斥着不必要和浪费的检查,我们将无法完成任何工作。是的,没错。我只是不想在一个好的解决方案之前发布一个优化的解决方案。一个优化的解决方案是一个好的解决方案。对不起,我不同意这一点,事实上我非常强烈。在我看来,一个像样的解决方案是,下一个开发人员也将能够立即阅读和理解所有后果,而无需阅读一些说明更模糊的后果的文档。一个优化的解决方案可能缺少这些特性,而不利于速度或内存消耗。至少,我一开始就是这么说“体面”这个词的。如果我使用这个词有误导性,我很抱歉。谢谢你的回答和对其他答案的详细评论!感谢您的回答和对其他答案的详细评论!