Python Удалить последние 3 символа строки

146

Я пытаюсь удалить последние 3 символа из строки в Python, я не знаю, что это за символы, поэтому я не могу их использовать rstrip, мне также нужно удалить пробелы и преобразовать их в верхний регистр

пример будет:

foo = "Bs12 3ab"
foo.replace(" ", "").rstrip(foo[-3:]).upper()

Это работает и дает мне BS12, что я хочу, однако, если последние 4-й и 3-й символы одинаковы, я теряю оба, например, если foo = "BS11 1AA"я просто получаю'BS'

Примеры fooмогут быть:

BS1 1AB
bs11ab
BS111ab

Строка может содержать 6 или 7 символов, и мне нужно отбросить последние 3 (при условии отсутствия пробелов)

Какие-нибудь советы?

Сэм Мачин
источник

Ответы:

278

Удаление любых пробелов:

foo = ''.join(foo.split())

Удаление последних трех символов:

foo = foo[:-3]

Преобразование в заглавные буквы:

foo = foo.upper()

Весь этот код в одной строке:

foo = ''.join(foo.split())[:-3].upper()
Noctis Skytower
источник
9
Я хотел бы отметить, что ''.join(foo.split())это лучше, чем foo.replace(' ', '')при использовании в строках Unicode, поскольку он удаляет любой символ пробела , в дополнение к ' 'символу (в частности, удаляются также неразрывные пробелы). Это, replace()вероятно, намного быстрее, поэтому его можно использовать, если, скажем, известно, что входные строки закодированы в ASCII, который имеет только один пробел (здесь я использую терминологию Python 2)
Eric O Lebigot
90

Это не работает, как вы ожидаете, потому что стриптиз основан на символах. Вам нужно сделать это вместо этого:

foo = foo.replace(' ', '')[:-3].upper()
Надя Алрамли
источник
11
Это не удаляет WHITESPACE, как запросил OP; удаляет только символы ПРОБЕЛ.
Джон Мачин
15
>>> foo = "Bs12 3ab"
>>> foo[:-3]
'Bs12 '
>>> foo[:-3].strip()
'Bs12'
>>> foo[:-3].strip().replace(" ","")
'Bs12'
>>> foo[:-3].strip().replace(" ","").upper()
'BS12'
ghostdog74
источник
2
@Lidia Да, strip удаляет только пробелы в начале и конце строки.
Элиэзер Мирон
Следует отметить, что вы не можете связать это, например, foo [3:] foo [: - 3]
crafter
9

Возможно, вы неправильно поняли rstrip, он удаляет не строку, а любой символ в указанной вами строке.

Как это:

>>> text = "xxxxcbaabc"
>>> text.rstrip("abc")
'xxxx'

Так что вместо этого просто используйте

text = text[:-3] 

(после замены пробела ничем)

Маттиас Нильссон
источник
3
>>> foo = 'BS1 1AB'
>>> foo.replace(" ", "").rstrip()[:-3].upper()
'BS1'
SilentGhost
источник
3

Я стараюсь избегать регулярных выражений, но это работает:

string = re.sub("\s","",(string.lower()))[:-3]

krs1
источник
1
string.lower () должен быть string.upper (). Моя ошибка.
krs1
это единственное решение, которое хорошо работает с
пробелами
1

Что с этим не так?

foo.replace(" ", "")[:-3].upper()
abyx
источник
1
  1. split
  2. slice
  3. concentrate

Это хорошая тренировка для начинающих, и ее легко достичь.

Другой продвинутый метод - это функция, подобная этой:

def trim(s):
    return trim(s[slice])

И для этого вопроса вы просто хотите удалить последние символы, так что вы можете написать так:

def trim(s):
    return s[ : -3] 

Я думаю, что вы должны заботиться о том, что эти три персонажа, так что вы проиграли. Вы просто хотите удалить последние три, тем не менее, кто они!

Если вы хотите удалить некоторые специфические символы, вы можете добавить некоторые условные суждения:

def trim(s):
    if [conditions]:   ### for some cases, I recommend using isinstance().
        return trim(s[slice])
Джайлин
источник
0

Разве вы не выполняете операции в неправильном порядке? Ваше требование кажетсяfoo[:-3].replace(" ", "").upper()

AndreaG
источник
указывает на следующее в вопросе >>> (при условии отсутствия пробелов)
Noctis Skytower
0

Это то, что зависит от вашего определения пробелов. Обычно я бы назвал пробелами пробелы, табуляции, разрывы строк и возврат каретки. Если это ваше определение, вы хотите использовать регулярное выражение с \ s для замены всех символов пробелов:

import re

def myCleaner(foo):
    print 'dirty: ', foo
    foo = re.sub(r'\s', '', foo)
    foo = foo[:-3]
    foo = foo.upper()
    print 'clean:', foo
    print

myCleaner("BS1 1AB")
myCleaner("bs11ab")
myCleaner("BS111ab")
Ли Жорамо
источник