Python ลบ 3 ตัวอักษรสุดท้ายของสตริง


146

ฉันกำลังพยายามลบอักขระ 3 ตัวสุดท้ายจากสตริงในหลามฉันไม่ทราบว่าอักขระเหล่านี้คืออะไรฉันจึงไม่สามารถใช้งานได้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 ร้องขอ มันจะลบเฉพาะพื้นที่อักขระ
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 ใช่ดึงเฉพาะช่องว่างออกจากจุดเริ่มต้นและจุดสิ้นสุดของสตริง
Eliezer Miron

ควรสังเกตว่าคุณไม่สามารถเชื่อมโยงสิ่งนี้ได้เช่น 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

นี่เป็นทางออกเดียวที่จัดการช่องว่างได้ดี
Erik Aronesty


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

บางอย่างขึ้นอยู่กับนิยามของช่องว่าง โดยทั่วไปฉันจะเรียกช่องว่างเป็นช่องว่างแท็บการขึ้นบรรทัดใหม่และการขึ้นบรรทัดใหม่ หากนี่เป็นคำจำกัดความของคุณคุณต้องการใช้ regex ด้วย \ 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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.