【问题标题】:Remove a prefix from a string [duplicate]从字符串中删除前缀[重复]
【发布时间】:2013-06-03 06:47:20
【问题描述】:

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

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

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

这给出了:

xtensions

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

有没有一种标准的方法可以从字符串的开头删除子字符串?

【问题讨论】:

标签: python


【解决方案1】:

我不知道“标准方式”。

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)

具有相同的行为。

【讨论】:

  • Python 3.9开始,可以使用removeprefix。示例见this answer
  • 酷!注意:新函数的行为与此答案完全相同(如果字符串不以prefix 开头,则返回字符串不变)
  • 这非常适合修剪hh:mm:ss 前导零而不损害重要零。我将前导 '0:''0' 替换为 null。这允许10:5:08 保持不变。
  • removeprefix — 迟到总比没有好。
【解决方案2】:

又短又甜:

def remove_prefix(text, prefix):
    return text[text.startswith(prefix) and len(prefix):]

【讨论】:

  • @jamylak 它就像“三元”和-或,但正确:) ... +1,虽然我认为它对于真正的代码来说有点太聪明了。而且您无法决定是否希望它引发异常。
  • 好吧,与公认的答案相比,在查看这样的代码时,您肯定需要考虑更长的时间,即使您更频繁地使用 Python。
  • 投反对票。这是一种不必要的聪明东西,甚至使阅读我自己的代码变得更加困难。
  • @MrR:Python 还有另一个经常未被充分利用的特性:cmets。
  • 注释有可能与它们所引用的代码分离,因此与澄清代码的灵丹妙药相去甚远。我更喜欢自我注释的代码。
【解决方案3】:

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

def remove_prefix(s, prefix):
    return s[len(prefix):] if s.startswith(prefix) else s

【讨论】:

  • +1 简洁。但是你能不能让它在错误情况下引发一些事情,并且仍然适合 2 行 x 80 列?
  • @personal_cloud: return s[s[:len(prefix)].index(prefix) + len(prefix):]
【解决方案4】:

我认为您可以使用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

【讨论】:

  • 迄今为止最优雅的解决方案。
【解决方案5】:

正则表达式解决方案(最好的方法是@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

【讨论】:

    【解决方案6】:
    def remove_prefix(str, prefix):
        if str.startswith(prefix):
            return str[len(prefix):]
        else:
            return str
    

    顺便说一句,str 是一个不好的变量名称,因为它隐藏了 str 类型。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 2023-04-05
      • 2016-12-30
      • 2021-07-18
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多