python: удалить подстроку только в конце строки - PullRequest
49 голосов
/ 08 сентября 2010

у меня есть куча строк

у некоторых из них есть ' rec'

я хочу удалить это, только если это последние 4 символа

так что другие слова

somestring='this is some string rec'

Я хочу, чтобы это было:

somestring='this is some string'

Как Python подходит к этому?

Ответы [ 9 ]

70 голосов
/ 08 сентября 2010
def rchop(thestring, ending):
  if thestring.endswith(ending):
    return thestring[:-len(ending)]
  return thestring

somestring = rchop(somestring, ' rec')
21 голосов
/ 08 сентября 2010

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

13 голосов
/ 03 декабря 2012

Если скорость не важна, используйте регулярное выражение:

import re

somestring='this is some string rec'

somestring = re.sub(' rec$', '', somestring)
4 голосов
/ 08 сентября 2010

Вы также можете использовать регулярное выражение:

from re import sub

str = r"this is some string rec"
regex = r"(.*)\srec$"
print sub(regex, r"\1", str)
3 голосов
/ 10 августа 2018

Вот однострочная версия ответа Джека Келли вместе с его родным братом:

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
1 голос
/ 02 января 2018

использование:

somestring.rsplit(' rec')[0]
1 голос
/ 08 сентября 2010

Как вид одного лайнера генератор присоединился:

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.
"""
0 голосов
/ 07 августа 2018

Принимая вдохновение от @ Дэвид Фостер ответ , я бы сделал

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 нарезка строк

0 голосов
/ 30 августа 2017

Используя more_itertools, мы можем rstrip строки, которые передают предикат.

Установка

> pip install more_itertools

Код

import more_itertools as mit


iterable = "this is some string rec".split()
" ".join(mit.rstrip(iterable, pred=lambda x: x in {"rec", " "}))
# 'this is some string'

" ".join(mit.rstrip(iterable, pred=lambda x: x in {"rec", " "}))
# 'this is some string'

Здесь мы пропускаем все конечные элементы, которые хотим удалить с конца.

Подробнее см. more_itertools документы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...