176

我正在尝试以一种清晰的 Py​​thon 方式执行以下操作:

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

print remove_prefix('template.extensions', 'template.')

这给出了:

xtensions

这不是我所期望的(extensions)。显然(愚蠢的我),因为我错误地使用了 lstrip:lstrip 将删除出现在传递的chars字符串中的所有字符,而不是将该字符串视为真正的字符串,而是将其视为“从字符串开头删除的一组字符” .

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

4

6 回答 6

302

我不知道“标准方式”。

def remove_prefix(text, prefix):
    if text.startswith(prefix):
        return text[len(prefix):]
    return text  # or whatever

正如@Boris 和@Stefan 所指出的,在 Python 3.9+ 上,您可以使用

text.removeprefix(prefix)

具有相同的行为。

于 2013-06-03T06:52:10.553 回答
61

简短而甜蜜:

def remove_prefix(text, prefix):
    return text[text.startswith(prefix) and len(prefix):]
于 2013-06-03T08:14:07.207 回答
47

这个怎么样(有点晚了):

def remove_prefix(s, prefix):
    return s[len(prefix):] if s.startswith(prefix) else s
于 2013-06-03T06:52:56.913 回答
14

我认为您可以使用该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
于 2013-06-03T06:53:59.817 回答
13

正则表达式解决方案(最好的方法是@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
于 2013-06-03T06:49:55.877 回答
2
def remove_prefix(str, prefix):
    if str.startswith(prefix):
        return str[len(prefix):]
    else:
        return str

顺便说str一句,对于变量来说,这是一个不好的名称,因为它会影响str类型。

于 2013-06-03T06:53:41.790 回答