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()

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'

2
@Lidia Да, strip удаляет только пробелы в начале и конце строки.
Элиэзер Мирон

Следует отметить, что вы не можете связать это, например, foo [3:] foo [: - 3]
crafter

9

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

Как это:

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

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

text = text[:-3] 

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



3

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

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


1
string.lower () должен быть string.upper (). Моя ошибка.
krs1

это единственное решение, которое хорошо работает с
пробелами


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()


указывает на следующее в вопросе >>> (при условии отсутствия пробелов)
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")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.