从字符串中删除前缀

dan*_*ast 75 python

我试图以明确的pythonic方式做以下事情:

def remove_prefix(str, prefix):
    return str.lstrip(prefix)

print remove_prefix('template.extensions', 'template.')
Run Code Online (Sandbox Code Playgroud)

这给出了:

xtensions
Run Code Online (Sandbox Code Playgroud)

这不是我期待的(extensions).显然,(愚蠢的我),因为我已经使用lstrip错误:lstrip将删除其出现在考试中的所有字符chars的字符串,不考虑该字符串作为一个真正的字符串,而是"一组字符从字符串的开头删除" .

是否有一种从字符串开头删除子字符串的标准方法?

Ela*_*zar 132

我不知道"标准方式".

def remove_prefix(text, prefix):
    if text.startswith(prefix):
        return text[len(prefix):]
    return text  # or whatever
Run Code Online (Sandbox Code Playgroud)

  • 从 `Python 3.9` 开始,您可以使用 [`removeprefix`](https://docs.python.org/3.9/library/stdtypes.html?highlight=removeprefix#str.removeprefix)。有关示例,请参阅[此答案](/sf/answers/4300278251/)。 (22认同)
  • 与“endswith()”平行的是“removesuffix()” (3认同)

mar*_*eau 28

短而甜蜜:

def remove_prefix(text, prefix):
    return text[text.startswith(prefix) and len(prefix):]
Run Code Online (Sandbox Code Playgroud)

  • 嗯,在审查这样的代码时,与已接受的答案相比,你肯定需要考虑更长的时间,即使你更频繁地使用 Python。 (6认同)
  • 注释有可能脱离它们所引用的代码,因此远非澄清代码的灵丹妙药。我更喜欢自我注释的代码。 (5认同)
  • @jamylak它就像"三元"和 - 或者,但是正确:) ... +1,虽然我觉得它对于真正的代码来说有点太聪明了.而且你无法决定是否希望它引发异常. (2认同)
  • 投了反对票。这是一种不必要的聪明的东西,甚至使阅读我自己的代码变得更加困难。 (2认同)
  • @martineau所以你建议巧妙地写一些东西,然后对其进行评论以更好地理解它,而不是仅仅以更简单的直接理解而无需评论的方式编写。不,谢谢。 (2认同)

msh*_*yem 23

这个怎么样(有点晚):

def remove_prefix(s, prefix):
    return s[len(prefix):] if s.startswith(prefix) else s
Run Code Online (Sandbox Code Playgroud)

  • @personal_cloud:`return s [s [:len(prefix)]。index(prefix)+ len(prefix):]` (2认同)

Blc*_*ght 8

我认为您可以使用该str类型的方法来执行此操作.不需要正则表达式:

def remove_prefix(text, prefix):
    if text.startswith(prefix): # only modify the text if it starts with the prefix
         text = text.replace(prefix, "", 1) # remove one instance of prefix
    return text
Run Code Online (Sandbox Code Playgroud)

  • `replace()`返回被替换的字符串,所以不要忘记实际上说`text = text.replace(prefix,"",1)`:) (2认同)

jam*_*lak 7

正则表达式解决方案(最好的方法是@Elazar的解决方案,这只是为了好玩)

import re
def remove_prefix(text, prefix):
    return re.sub(r'^{0}'.format(re.escape(prefix)), '', text)

>>> print remove_prefix('template.extensions', 'template.')
extensions
Run Code Online (Sandbox Code Playgroud)