Python Dizenin son 3 karakterini kaldır


146

Python bir dize son 3 karakter kaldırmak için çalışıyorum, bu karakterler ne olduğunu bilmiyorum bu yüzden kullanamıyorum rstrip, ben de herhangi bir beyaz boşluk kaldırmak ve büyük harfe dönüştürmek gerekir

bir örnek:

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

Bu eserler ve son 4 & 3 karakter eğer ben hem örneğin gevşek aynıdır ancak eğer istediğim budur bana BS12 verir foo = "BS11 1AA"Sadece almak'BS'

örnekleri fooşunlar olabilir:

BS1 1AB
bs11ab
BS111ab

Dize 6 veya 7 karakter olabilir ve son 3'ü bırakmam gerekiyor (beyaz boşluk olmadığı varsayılarak)

Herhangi bir ipucu?

Yanıtlar:


278

Tüm boşlukları kaldırma:

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

Son üç karakteri kaldırma:

foo = foo[:-3]

Büyük harflere dönüştürme:

foo = foo.upper()

Bu kodun tümü tek bir satırda:

foo = ''.join(foo.split())[:-3].upper()

9
Unicode dizeleri kullanıldığında, karaktere ek olarak herhangi bir boşluk karakteri kaldırdığından ''.join(foo.split())daha iyi olduğunu belirtmek isterim (özellikle, kırılmayan boşluklar da kaldırılır). Bu muhtemelen çok daha hızlıdır, bu nedenle, giriş dizelerinin yalnızca bir boşluk karakteri olan ASCII'de kodlandığı biliniyorsa kullanılabilir (burada Python 2 terminolojisi kullanıyorum.)foo.replace(' ', '')' 'replace()
Eric O Lebigot

90

Beklediğiniz gibi çalışmaz, çünkü şerit karakter tabanlıdır. Bunun yerine bunu yapmanız gerekir:

foo = foo.replace(' ', '')[:-3].upper()

11
Bu OP'nin istediği gibi WHITESPACE öğesini kaldırmaz; yalnızca SPACE karakterlerini kaldırır.
John Machin

15
>>> foo = "Bs12 3ab"
>>> foo[:-3]
'Bs12 '
>>> foo[:-3].strip()
'Bs12'
>>> foo[:-3].strip().replace(" ","")
'Bs12'
>>> foo[:-3].strip().replace(" ","").upper()
'BS12'

2
@Lidia Evet, şerit yalnızca boşluğu dizenin başından ve sonundan kaldırır.
Eliezer Miron

Bunu zincirleyemeyeceğinize dikkat edilmelidir, örneğin foo [3:] foo [: - 3]
crafter

9

Rstrip'i biraz yanlış anlamış olabilirsiniz, bir dize değil, belirttiğiniz dizedeki herhangi bir karakteri şeritler.

Bunun gibi:

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

Bunun yerine, sadece

text = text[:-3] 

(boşlukları hiçbir şeyle değiştirdikten sonra)


3
>>> foo = 'BS1 1AB'
>>> foo.replace(" ", "").rstrip()[:-3].upper()
'BS1'

3

Düzenli ifadelerden kaçınmaya çalışıyorum, ancak bu işe yarıyor gibi görünüyor:

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


1
string.lower (), string.upper () olmalıdır. Benim hatam.
krs1

boşlukları iyi ele alan tek çözüm bu
Erik Aronesty

1

Bunun nesi var?

foo.replace(" ", "")[:-3].upper()

1
  1. split
  2. slice
  3. concentrate

Bu yeni başlayanlar için iyi bir egzersizdir ve başarılması kolaydır.

Başka bir gelişmiş yöntem şöyle bir işlevdir:

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

Ve bu soru için, sadece son karakterleri kaldırmak istiyorsunuz, böylece şöyle yazabilirsiniz:

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

Sanırım bu üç karakterin ne olduğunu umursuyorsun, böylece kaybettin. Sadece son üçünü çıkarmak istiyorsun, yine de kim olduklarını!

Bazı belirli karakterleri kaldırmak istiyorsanız, karar verirseniz bazı karakterler ekleyebilirsiniz:

def trim(s):
    if [conditions]:   ### for some cases, I recommend using isinstance().
        return trim(s[slice])

0

İşlemleri yanlış sırada yapmıyor musunuz? İhtiyacınız var gibi görünüyorfoo[:-3].replace(" ", "").upper()


aşağıdaki soruları gösteriyor >>> (boşluk olmadığı varsayılarak)
Noctis Skytower

0

Beyaz alan tanımınıza bağlı olan bazı şeyler. Genelde boşluk, sekme, satır sonu ve satır başı olarak adlandırırım. Tanımınız buysa, tüm boşluk karakterlerini değiştirmek için \ s ile normal ifade kullanmak istersiniz:

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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.