我有一堆字符串
其中一些人有' rec'
我想删除它只有那些是最后4个字符
所以另外一句话
somestring='this is some string rec'
我希望它是:
somestring='this is some string'
什么是python方法来解决这个问题?
答案 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
答案 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