既然您必须获得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
正如你所看到的,基于正则表达式的解决方案通常会“过度设计”问题而变得“远不如其他方法”,这也可能是为什么在Python社区中RE拥有如此糟糕声誉的原因之一。尽管如此,@ Jack评论中的建议比@ Andrew最初提出的要好得多。预计基于字符串的解决方案将显示出更好的性能,我的避免使用endswith的实现相对于@ Jack的实现略微快15%。 因此,两个基于字符串的方法都很好(而且都简洁明了),我只是更喜欢我的变体,因为我本质上是一个节俭的人(有些人可能会说,小气),“不浪费,不虚度”!
endswith
还可以接受一个后缀元组进行查找。如果有人将元组作为suffix
传递给此函数,则会得到错误的结果。它将检查一个字符串列表,但删除字符串列表的长度,而不是匹配字符串的长度。 - user3064538