python:仅在字符串末尾删除子字符串

时间:2010-09-07 23:25:18

标签: python string

我有一堆字符串

其中一些人有' rec'

我想删除它只有那些是最后4个字符

所以另外一句话

somestring='this is some string rec'

我希望它是:

somestring='this is some string'

什么是python方法来解决这个问题?

11 个答案:

答案 0 :(得分:70)

def rchop(thestring, ending):
  if thestring.endswith(ending):
    return thestring[:-len(ending)]
  return thestring

somestring = rchop(somestring, ' rec')

答案 1 :(得分:21)

因为你必须得到len(trailing)(其中trailing是你要删除的字符串,如果它正在落后),我建议避免.endswith会轻微重复工作在这种情况下的原因。当然,代码的证明是在时间上,所以,让我们做一些测量(在受访者提出之后命名函数):

import re

astring = 'this is some string rec'
trailing = ' rec'

def andrew(astring=astring, trailing=trailing):
    regex = r'(.*)%s$' % re.escape(trailing)
    return re.sub(regex, r'\1', astring)

def jack0(astring=astring, trailing=trailing):
    if astring.endswith(trailing):
        return astring[:-len(trailing)]
    return astring

def jack1(astring=astring, trailing=trailing):
    regex = r'%s$' % re.escape(trailing)
    return re.sub(regex, '', astring)

def alex(astring=astring, trailing=trailing):
    thelen = len(trailing)
    if astring[-thelen:] == trailing:
        return astring[:-thelen]
    return astring

假设我们已将此python文件命名为a.py,并且它位于当前目录中;现在,......:

$ python2.6 -mtimeit -s'import a' 'a.andrew()'
100000 loops, best of 3: 19 usec per loop
$ python2.6 -mtimeit -s'import a' 'a.jack0()'
1000000 loops, best of 3: 0.564 usec per loop
$ python2.6 -mtimeit -s'import a' 'a.jack1()'
100000 loops, best of 3: 9.83 usec per loop
$ python2.6 -mtimeit -s'import a' 'a.alex()'
1000000 loops, best of 3: 0.479 usec per loop

如您所见,基于RE的解决方案“无可救药地超越”(通常在一个“过度杀戮”问题时发生 - 可能是RE在Python社区中有如此糟糕的代表的原因之一! - ) @ Jack的评论中的建议比@ Andrew的原创要好。正如预期的那样,基于字符串的解决方案与我的endswith一起使用 - 避免了一个比@ Jack更轻微的优势(仅快15%)。所以,两个纯粹的想法都是好的(以及简洁和清晰) - 我更喜欢我的变体只是因为我,通过性格,节俭(有些人可能会说,吝啬;-)人.. “不要浪费,不要”! - )

答案 2 :(得分:13)

如果速度不重要,请使用正则表达式:

import re

somestring='this is some string rec'

somestring = re.sub(' rec$', '', somestring)

答案 3 :(得分:5)

Python 3.9开始,您可以使用removesuffix

'this is some string rec'.removesuffix(' rec')
# 'this is some string'

答案 4 :(得分:4)

您也可以使用正则表达式:

from re import sub

str = r"this is some string rec"
regex = r"(.*)\srec$"
print sub(regex, r"\1", str)

答案 5 :(得分:3)

这是杰克·凯利(Jack Kelly)的答案及其同级的单线版本:

def rchop(s, sub):
    return s[:-len(sub)] if s.endswith(sub) else s

def lchop(s, sub):
    return s[len(sub):] if s.startswith(sub) else s

答案 6 :(得分:1)

作为一种衬里发电机的加入:

test = """somestring='this is some string rec'
this is some string in the end word rec
This has not the word."""
match = 'rec'
print('\n'.join((line[:-len(match)] if line.endswith(match) else line)
      for line in test.splitlines()))
""" Output:
somestring='this is some string rec'
this is some string in the end word 
This has not the word.
"""

答案 7 :(得分:1)

使用:

somestring.rsplit(' rec')[0]

答案 8 :(得分:0)

使用more_itertools,我们可以Employee传递谓词的字符串。

安装

rstrip

代码

> pip install more_itertools

这里我们传递了我们希望从最后删除的所有尾随项​​目。

有关详细信息,另请参阅more_itertools docs

答案 9 :(得分:0)

我将从@David Foster's answer那里获得灵感

def _remove_suffix(text, suffix):
    if text is not None and suffix is not None:
        return text[:-len(suffix)] if text.endswith(suffix) else text
    else:
        return text

参考:Python string slicing

答案 10 :(得分:0)


def remove_trailing_string(content, trailing):
    """
    Strip trailing component `trailing` from `content` if it exists.
    """
    if content.endswith(trailing) and content != trailing:
        return content[:-len(trailing)]
    return content