【问题标题】:Removing the first part of a concatenated string with Python使用 Python 删除连接字符串的第一部分
【发布时间】:2010-07-12 03:38:28
【问题描述】:

我有一个字符串如下

CompilationStatistics_Compilation_StepList_Map_TimingUsage_ClockList_Clock_MinimumPeriod

删除第一部分 (CompilationStatistics_) 或最后一部分 (_MiniumuPeriod) 的最简单方法是什么?

我正在考虑使用正则表达式,但我希望应该有更好的方法。

m = re.search("{.+}_{.+}", string)
m.group(2)

【问题讨论】:

    标签: python string


    【解决方案1】:

    请参阅String methods 的 Python 文档,尤其是 partitionrpartition

    s = "CompilationStatistics_Compilation_StepList_Map_TimingUsage_ClockList_Clock_MinimumPeriod"
    print s.partition('_')[2].rpartition('_')[0]
    

    结果

    Compilation_StepList_Map_TimingUsage_ClockList_Clock
    

    【讨论】:

    • 需要 Python >=2.5,但如果您同意,这是最好的答案。
    • 您的回答是关于极端情况的最正确的答案(请参阅我在 Matthew Flaschen 的回答中的评论),但是您的 cmets 中的推理不是很合理,很抱歉:)
    • 我认为 Matthew Iselin 的回答是最准确的,因为我读到的问题确实是“我有一堆单词加上下划线,我想要除了第一个和最后一个之外的所有单词”,他优雅地捕捉到了这一点。其他人可能对问题的解析不同,但我坚持我对另一个答案的推理:find()-ing 并在对索引进行切片之前将 1 添加到索引是一种解决方案,如果它是在我曾经工作过的任何地方提交的,会被重写。
    • Jesse,如果.find() 解决方案正常工作,那将是个人喜好问题;但是,它并非在所有情况下都能正常工作,这就是不应该考虑它的原因。当您批评该答案时,解释为什么答案不好是 IMO 的合理推理。不解释和/或依靠投票来证明你的理由是不是合理的推理,再次 IMO。我就是这个意思。
    • 我不知道find 解决方案中的角落案例,所以我不能批评它。关于投票的评论并不是说我的投票是优越的,因为它有更多的选票——当时我说我的解决方案不是投票领袖——而是表达投票是决定意见问题的一种方式。我解释说我认为这不是最好的答案,因为它不雅。它有一个失败的极端案例这一事实是对它的额外打击,也是一个目标——因此更好——取消它的理由。
    【解决方案2】:

    '_'.join(s.split("_")[1:-1])?

    更改接头编号将改变您获得的数量:例如,删除“-1”只会删除第一项。

    【讨论】:

      【解决方案3】:

      除了第一个之外:

      s[s.find('_') + 1:]
      

      除了最后一个:

      s[0:s.rfind('_')]
      

      没有任何一个:

      s[s.find('_') + 1:s.rfind('_')]
      

      find 返回字符串的第一个索引,rfind 返回最后一个。然后,我们只使用切片语法。

      【讨论】:

      • 真的不同意这是最好的答案。该问题与查找下划线字符的索引无关,因此查找和切片它们是完全不必要的步骤。
      • @Jesse,我可以轻松地说这个问题与分区无关,创建两个中间列表是不必要的步骤。我的代码更短、更快(使用timeit),并且在我看来更清晰。
      • 嗯,我想这就是为什么我们要投票来决定这些主观问题。
      • 好吧,投票只不过是偶然(或偶然)的流行。我更喜欢 r?partition 方法,因为 .rfind 方法有一个缺陷(尝试为没有下划线的s 获取“All but last”或“Without either”。)。
      【解决方案4】:

      如果你知道要切出的块的大小,可以使用 Python 的string slicing,像这样:

      s="CompilationStatistics_Compilation_StepList_Map_TimingUsage_ClockList_Clock_MinimumPeriod"
      print s[22:-14]
      

      当然,还有其他方法可以找到所需的数字,例如使用String.rindex() 找到要切断的结束块的开始位置。例如:

      print s[len("CompilationStatistics_"):s.rindex("_MinimumPeriod")]
      

      【讨论】:

        【解决方案5】:

        使用 split() 可以轻松删除第一部分:

        s.split("_", 1)[1] # Take the second part of the string, split into 2 pieces.
        

        【讨论】:

        • 这正是创建 .partition.rpartition 方法的原因。
        猜你喜欢
        • 2018-12-07
        • 1970-01-01
        • 2020-08-06
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        • 2012-03-31
        相关资源
        最近更新 更多