Python Xóa 3 ký tự cuối cùng của chuỗi


146

Tôi đang cố xóa 3 ký tự cuối cùng khỏi một chuỗi trong python, tôi không biết những ký tự này là gì nên tôi không thể sử dụng rstrip, tôi cũng cần xóa bất kỳ khoảng trắng nào và chuyển sang chữ hoa

một ví dụ sẽ là:

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

Điều này hoạt động và mang lại cho tôi BS12, đó là những gì tôi muốn, tuy nhiên nếu các ký tự thứ 4 và thứ 3 giống nhau thì tôi mất cả hai, ví dụ nếu foo = "BS11 1AA"tôi chỉ nhận được'BS'

ví dụ về foocó thể là:

BS1 1AB
bs11ab
BS111ab

Chuỗi có thể là 6 hoặc 7 ký tự và tôi cần bỏ 3 ký tự cuối cùng (giả sử không có khoảng trắng)

Bất cứ lời khuyên?

Câu trả lời:


278

Xóa bất kỳ và tất cả các khoảng trắng:

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

Xóa ba ký tự cuối cùng:

foo = foo[:-3]

Chuyển đổi thành chữ in hoa:

foo = foo.upper()

Tất cả mã đó trong một dòng:

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

9
Tôi muốn lưu ý rằng ''.join(foo.split())tốt hơn foo.replace(' ', ''), khi được sử dụng trên các chuỗi unicode vì nó loại bỏ bất kỳ tự khoảng trắng nào , ngoài ' 'ký tự (đặc biệt, các khoảng trắng không bị phá vỡ cũng bị loại bỏ). Điều đó replace()có lẽ nhanh hơn nhiều, vì vậy nó có thể được sử dụng nếu, giả sử, các chuỗi đầu vào được biết là được mã hóa trong ASCII, chỉ có một ký tự khoảng
trắng

90

Nó không hoạt động như bạn mong đợi vì dải dựa trên nhân vật. Bạn cần phải làm điều này thay vào đó:

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

11
Điều đó không loại bỏ WHITESPACE như OP yêu cầu; nó chỉ xóa các ký tự KHÔNG GIAN.
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 Có, dải chỉ xóa khoảng trắng từ đầu và cuối chuỗi.
Eliezer Miron

Cần lưu ý rằng bạn không thể chuỗi này ví dụ foo [3:] foo [: - 3]
crafter

9

Bạn có thể đã hiểu nhầm rstrip một chút, nó không phải là một chuỗi mà là bất kỳ ký tự nào trong chuỗi bạn chỉ định.

Như thế này:

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

Vì vậy, thay vào đó, chỉ cần sử dụng

text = text[:-3] 

(sau khi thay thế khoảng trắng bằng không có gì)


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

3

Tôi cố gắng tránh các biểu thức thông thường, nhưng điều này dường như hoạt động:

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


1
chuỗi.lower () phải là string.upper (). Lỗi của tôi.
krs1

đây là giải pháp duy nhất giải quyết tốt khoảng trắng
Erik Aronesty

1

Có chuyện gì với cái này vậy?

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

1
  1. split
  2. slice
  3. concentrate

Đây là một tập luyện tốt cho người mới bắt đầu và nó dễ dàng để đạt được.

Một phương pháp nâng cao khác là một chức năng như thế này:

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

Và đối với câu hỏi này, bạn chỉ muốn xóa các ký tự cuối cùng, vì vậy bạn có thể viết như thế này:

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

Tôi nghĩ rằng bạn đã quan tâm đến ba nhân vật đó là gì, vì vậy bạn đã mất. Bạn chỉ muốn loại bỏ ba người cuối cùng, tuy nhiên họ là ai!

Nếu bạn muốn xóa một số ký tự cụ thể, bạn có thể thêm một số nếu phán đoán:

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

0

Không phải bạn đang thực hiện các hoạt động theo thứ tự sai? Bạn yêu cầu dường nhưfoo[:-3].replace(" ", "").upper()


điểm ở phần sau trong câu hỏi >>> (giả sử không có khoảng trắng)
Noctis Skytower

0

Đó là một số những gì phụ thuộc vào định nghĩa của bạn về khoảng trắng. Tôi thường gọi khoảng trắng là khoảng trắng, tab, ngắt dòng và trả về vận chuyển. Nếu đây là định nghĩa của bạn, bạn muốn sử dụng biểu thức chính quy với \ s để thay thế tất cả các biểu đồ khoảng trắng:

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")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.