Так как вы все равно должны получить 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's (будучи всего на 15% быстрее).Итак, обе чистые струнные идеи хороши (а также являются краткими и ясными) - я предпочитаю свой вариант немного только потому, что я по характеру скромный (некоторые могут сказать, скупой ;-) человек .."не трать, не хочешь"! -)