ลบช่องว่างทั้งหมดในสตริง


788

ฉันต้องการกำจัดช่องว่างทั้งหมดออกจากสตริงที่ปลายทั้งสองและระหว่างคำ

ฉันมีรหัส Python นี้:

def my_handle(self):
    sentence = ' hello  apple  '
    sentence.strip()

แต่นั่นจะกำจัดช่องว่างทั้งสองด้านของสตริงเท่านั้น ฉันจะลบช่องว่างทั้งหมดได้อย่างไร


4
ผลลัพธ์ของคุณควรเป็นอย่างไร hello apple? helloapple?
Mark Byers

4
@JoachimPileborg ไม่ใช่อย่างที่ฉันคิดเพราะมันเกี่ยวกับการลดช่องว่างระหว่างคำ
wal-o-mat

3
helloapple ต้องเป็นผลลัพธ์ของฉัน
co2f2e

8
แก้ไขให้ฉันถ้าผิด แต่ "ช่องว่าง" ไม่ได้มีความหมายเหมือนกันกับ "อักขระช่องว่าง" คำตอบที่ปัจจุบันทำเครื่องหมายว่าถูกต้องไม่เอาทุกช่องว่าง แต่เนื่องจากถูกทำเครื่องหมายว่าถูกต้องจึงต้องตอบคำถามที่ตั้งใจไว้ ดังนั้นเราควรแก้ไขคำถามเพื่อสะท้อนคำตอบที่ยอมรับหรือไม่ @Kalanamith คุณต้องการลบช่องว่างทั้งหมดหรือเฉพาะช่องว่างออกหรือไม่
AnnanFay

คำตอบ:


1659

หากคุณต้องการลบช่องว่างนำหน้าและท้ายสุดให้ใช้str.strip():

sentence = ' hello  apple'
sentence.strip()
>>> 'hello  apple'

หากคุณต้องการลบอักขระช่องว่างทั้งหมดให้ใช้str.replace():

(หมายเหตุนี่จะเป็นการลบอักขระช่องว่าง“ ปกติ” ASCII ' ' U+0020เท่านั้น แต่ไม่สามารถลบช่องว่างอื่น ๆ ได้ )

sentence = ' hello  apple'
sentence.replace(" ", "")
>>> 'helloapple'

หากคุณต้องการลบช่องว่างที่ซ้ำกันให้ใช้str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'

42
ความยอดเยี่ยมของฟังก์ชั่นนี้คือมันสามารถลบ '\ r \ n' ออกจากไฟล์ html ที่ฉันได้รับจาก Beautiful Soup
lsheng

27
ฉันชอบ "" .join (ประโยค.split ()) สิ่งนี้จะลบช่องว่างทั้งหมด (ช่องว่างแท็บบรรทัดใหม่) ออกจากที่ใดก็ได้ในประโยค
ดอน

ขอทานที่นี่ มีคนอธิบายได้ไหมว่าเพราะเหตุใดพิมพ์ (ประโยค.join (ประโยค.split ())) ให้ผลลัพธ์เป็น 'hello hello appleapple' เพียงต้องการที่จะเข้าใจวิธีการประมวลผลรหัสที่นี่
Yannis Dran

2
@YannisDran ตรวจสอบเอกสารstr.join ()เมื่อคุณโทรหาsentence.join(str_list)คุณขอให้ python เข้าร่วมรายการจาก str_list ด้วยsentenceตัวคั่น
Cédric Julien

1
"".join(sentence.split())เป็นทางออกที่ยอมรับได้อย่างแท้จริงลบช่องว่างทั้งหมดได้อย่างมีประสิทธิภาพมากกว่าเพียงแค่ช่องว่าง คำตอบที่ยอดเยี่ยมของMark Byersน่าจะได้รับการยอมรับแทนคำตอบที่ไม่เหมาะสม
เซซิลแกงกะหรี่

263

หากต้องการลบช่องว่างให้ใช้str.replace:

sentence = sentence.replace(' ', '')

ในการลบอักขระช่องว่างทั้งหมด (พื้นที่แท็บขึ้นบรรทัดใหม่และอื่น ๆ ) คุณสามารถใช้splitแล้วjoin:

sentence = ''.join(sentence.split())

หรือการแสดงออกปกติ:

import re
pattern = re.compile(r'\s+')
sentence = re.sub(pattern, '', sentence)

หากคุณต้องการลบพื้นที่ว่างออกจากจุดเริ่มต้นและจุดสิ้นสุดคุณสามารถใช้strip:

sentence = sentence.strip()

คุณยังสามารถใช้lstripเพื่อลบช่องว่างเฉพาะจากจุดเริ่มต้นของสตริงและrstripเพื่อลบช่องว่างจากปลายสาย


หมายเหตุ: คุณไม่จำเป็นต้องคอมไพล์ขั้นตอน re.sub (และเพื่อน) แคชรูปแบบที่คอมไพล์แล้ว ดูเพิ่มเติม, คำตอบของเอมิล
Andy Hayden

python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392

104

อีกทางเลือกหนึ่งคือการใช้นิพจน์ทั่วไปและจับคู่อักขระช่องว่างสีขาวเหล่านี้ด้วย นี่คือตัวอย่างบางส่วน:

ลบช่องว่างทั้งหมดในสตริงแม้ระหว่างคำ:

import re
sentence = re.sub(r"\s+", "", sentence, flags=re.UNICODE)

ลบช่องว่างใน BEGINNING ของสตริง:

import re
sentence = re.sub(r"^\s+", "", sentence, flags=re.UNICODE)

ลบช่องว่างที่ส่วนท้ายของสตริง:

import re
sentence = re.sub(r"\s+$", "", sentence, flags=re.UNICODE)

ลบช่องว่างทั้งในการเริ่มต้นและในตอนท้ายของสตริง:

import re
sentence = re.sub("^\s+|\s+$", "", sentence, flags=re.UNICODE)

ลบช่องว่างซ้ำซ้อนเท่านั้น:

import re
sentence = " ".join(re.split("\s+", sentence, flags=re.UNICODE))

(ตัวอย่างทั้งหมดทำงานได้ทั้ง Python 2 และ Python 3)


ไม่ทำงานสำหรับ "\ u202a1234 \ u202c" ให้ผลลัพธ์ที่เหมือนกัน: u '\ u202a1234 \ u202c'
Sarang

@Sangang: ไม่ใช่อักขระช่องว่าง (google และคุณจะเห็น) แต่เป็น "เครื่องหมายวรรคตอนทั่วไป" คำตอบของฉันเกี่ยวข้องกับการลบอักขระที่จัดเป็นช่องว่างออกเท่านั้น
Emil Stenström

นี่เป็นทางออกเดียวที่ฉันเห็นที่นี่ซึ่งลบตัวละครช่องว่างที่น่ารำคาญเหล่านั้นออกไปขอบคุณมาก
CapnShanty

41

ช่องว่างรวมถึงพื้นที่แท็บและ CRLF ดังนั้นที่สง่างามและหนึ่งซับฟังก์ชั่นสตริงเราสามารถใช้เป็นstr.translate:

Python 3

' hello  apple'..translate(str.maketrans('', '', ' \n\t\r'))

หรือถ้าคุณต้องการที่จะละเอียด:

import string
' hello  apple'..translate(str.maketrans('', '', string.whitespace))

Python 2

' hello  apple'.translate(None, ' \n\t\r')

หรือถ้าคุณต้องการที่จะละเอียด:

import string
' hello  apple'.translate(None, string.whitespace)

2
สิ่งนี้จะไม่ช่วยในเรื่องของ Unicode whitespace อย่างเช่น\xc2\xa0
Suzana

5
ans.translate( None, string.whitespace )ผลิตเฉพาะbuiltins.TypeError: translate() takes exactly one argument (2 given)สำหรับฉัน เอกสารกล่าวว่าอาร์กิวเมนต์นั้นเป็นตารางการแปลให้ดูที่ string.maketrans () แต่ดูความคิดเห็นโดย Amnon Harel ด้านล่าง
user405

2
' hello apple'.translate(str.maketrans('', '', string.whitespace))หมายเหตุ: เป็นการดีกว่าที่จะจัดทำตัวแปรเพื่อจัดเก็บตารางทรานส์หากคุณตั้งใจจะทำหลายครั้ง
Shogan Aversa-Druesne

16

stripสำหรับการลบช่องว่างจากจุดเริ่มต้นและจุดสิ้นสุดการใช้งาน

>> "  foo bar   ".strip()
"foo bar"

1
คำถามถามโดยเฉพาะการลบช่องว่างทั้งหมดและไม่เพียง แต่ในตอนท้าย กรุณาแจ้งให้ทราบล่วงหน้า
Shayan Shafiq

9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaK ได้ชี้ให้เห็นวิธีการ "แปล" ด้านบน และรูปแบบนี้ใช้ได้กับ Python 3 (ดูคำถาม & คำตอบนี้ )


2
ขอบคุณ! หรือxxx.translate( { ord(c) :None for c in string.whitespace } )เพื่อความทั่วถึง
user405

7

ระวัง:

strip ทำ rstrip และ lstrip (ลบช่องว่างนำหน้าและต่อท้าย, แท็บ, ผลตอบแทนและแบบฟอร์มฟีด แต่จะไม่ลบออกในช่วงกลางของสตริง)

หากคุณแทนที่ช่องว่างและแท็บคุณสามารถจบลงด้วย CRLF ที่ซ่อนอยู่ซึ่งดูเหมือนจะตรงกับสิ่งที่คุณกำลังมองหา แต่ไม่เหมือนกัน


3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)

3
คำถามคือลบพื้นที่สีขาวทั้งหมดซึ่งรวมถึงแท็บและอักขระบรรทัดใหม่ด้วยตัวอย่างนี้จะลบช่องว่างปกติเท่านั้น
Maximilian Peters

3

นอกจากนี้สตริปมีรูปแบบบางอย่างดังนี้:

ลบช่องว่างใน BEGINNING และ END ของสตริง:

sentence= sentence.strip()

ลบช่องว่างใน BEGINNING ของสตริง:

sentence = sentence.lstrip()

ลบช่องว่างที่ส่วนท้ายของสตริง:

sentence= sentence.rstrip()

ทั้งสามฟังก์ชั่นสตริงstrip lstripและrstripสามารถใช้พารามิเตอร์ของสตริงที่จะตัดกับค่าเริ่มต้นเป็นพื้นที่สีขาวทั้งหมด สิ่งนี้มีประโยชน์เมื่อคุณทำงานกับบางสิ่งบางอย่างโดยเฉพาะเช่นคุณสามารถลบเฉพาะที่ว่าง แต่ไม่ขึ้นบรรทัดใหม่:

" 1. Step 1\n".strip(" ")

หรือคุณสามารถลบเครื่องหมายจุลภาคพิเศษเมื่ออ่านในรายการสตริง:

"1,2,3,".strip(",")

1

กำจัดช่องว่างทั้งหมดออกจากสตริงที่ปลายทั้งสองและระหว่างคำ

>>> import re
>>> re.sub("\s+", # one or more repetition of whitespace
    '', # replace with empty string (->remove)
    ''' hello
...    apple
... ''')
'helloapple'

Python docs:


ฉันreได้รับการแนะนำก่อนหน้านี้ แต่ฉันพบว่าคำตอบที่แท้จริงของชื่อคำถามนั้นซ่อนอยู่เล็กน้อยในตัวเลือกอื่น ๆ ทั้งหมด
จัดการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.