Hapus semua spasi putih dalam sebuah string

788

Saya ingin menghilangkan semua spasi putih dari string, di kedua ujungnya, dan di antara kata-kata.

Saya punya kode Python ini:

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

Tapi itu hanya menghilangkan spasi putih di kedua sisi string. Bagaimana cara menghapus semua spasi putih?

co2f2e
sumber
4
Seperti apa hasil Anda? hello apple? helloapple?
Mark Byers
4
@ JoachimPileborg, tidak persis saya pikir, karena ini juga tentang reducung spasi putih di antara kata-kata.
wal-o-mat
3
helloapple harus menjadi output saya
co2f2e
8
Perbaiki saya jika salah, tetapi "spasi putih" tidak sama dengan "karakter spasi". Jawaban saat ini yang ditandai dengan benar tidak menghapus semua spasi putih . Tapi, karena itu ditandai sebagai benar, itu pasti menjawab pertanyaan yang dimaksud? Jadi kita harus mengedit pertanyaan untuk mencerminkan jawaban yang diterima? @Kalanamith Apakah Anda ingin menghapus semua spasi putih atau hanya spasi?
AnnanFay

Jawaban:

1659

Jika Anda ingin menghapus spasi awal dan akhir, gunakan str.strip():

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

Jika Anda ingin menghapus semua karakter spasi, gunakan str.replace():

(NB ini hanya menghilangkan karakter ruang ASCII "normal" ' ' U+0020tetapi tidak spasi putih lainnya )

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

Jika Anda ingin menghapus ruang yang digandakan, gunakan str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'
Cédric Julien
sumber
42
Kehebatan fungsi ini adalah ia juga menghapus '\ r \ n' dari file html yang saya terima dari Beautiful Soup.
lsheng
27
Saya suka "" .join (kalimat.split ()), ini menghapus semua spasi putih (spasi, tab, baris baru) dari mana saja dalam kalimat.
don
pemula di sini. Dapatkah seseorang menjelaskan kepada saya mengapa hasil cetak (kalimat.join (kalimat.split ())) dihasilkan menjadi 'halo apel appleapple'? Hanya ingin mengerti bagaimana kode diproses di sini.
Yannis Dran
2
@YannisDran memeriksa dokumentasi str.join () , ketika Anda menelepon sentence.join(str_list)Anda meminta python untuk bergabung dengan item dari str_list dengan sentencesebagai pemisah.
Cédric Julien
1
"".join(sentence.split())memang solusi kanonik, efisien menghapus semua spasi putih daripada hanya ruang. Mark Byers ' jawaban yang sangat baik mungkin harus telah diterima sebagai pengganti jawaban kurang berlaku ini.
Cecil Curry
263

Untuk menghapus hanya spasi gunakan str.replace:

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

Untuk menghapus semua karakter spasi (spasi, tab, baris baru, dan sebagainya) Anda dapat menggunakan splitmaka join:

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

atau ekspresi reguler:

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

Jika Anda hanya ingin menghapus spasi putih dari awal dan akhir, Anda dapat menggunakan strip:

sentence = sentence.strip()

Anda juga dapat menggunakan lstripuntuk menghapus spasi putih hanya dari awal string, dan rstripuntuk menghapus spasi putih dari akhir string.

Mark Byers
sumber
Catatan: Anda tidak perlu mengkompilasi langkah, re.sub (dan teman-teman) cache pola dikompilasi. Lihat juga, jawaban Emil .
Andy Hayden
python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392
104

Alternatifnya adalah menggunakan ekspresi reguler dan mencocokkan karakter spasi putih yang aneh ini juga. Berikut ini beberapa contohnya:

Hapus SEMUA spasi dalam string, bahkan di antara kata-kata:

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

Hapus spasi dalam AWAL string:

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

Hapus spasi di AKHIR string:

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

Hapus spasi di AWAL dan di AKHIR string:

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

Hapus ruang HANYA DUPLICATE:

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

(Semua contoh berfungsi di Python 2 dan Python 3)

Emil Stenström
sumber
Tidak bekerja untuk "\ u202a1234 \ u202c". Memberikan hasil yang sama: u '\ u202a1234 \ u202c'
Sarang
@ Sarang: Itu bukan karakter spasi putih (google mereka dan Anda akan melihat) tetapi "Tanda Baca Umum". Jawaban saya hanya berurusan dengan menghilangkan karakter yang diklasifikasikan sebagai spasi.
Emil Stenström
Ini adalah satu-satunya solusi yang saya lihat di sini yang menghilangkan karakter spasi putih unicode sial itu, terima kasih fam
CapnShanty
41

Spasi mencakup ruang, tab, dan CRLF . Jadi fungsi string yang elegan dan satu garis yang dapat kita gunakan adalah str.translate:

Python 3

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

ATAU jika Anda ingin teliti:

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

Python 2

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

ATAU jika Anda ingin teliti:

import string
' hello  apple'.translate(None, string.whitespace)
Nyonya
sumber
2
Ini tidak akan membantu dengan ruang kosong Unicode seperti\xc2\xa0
Suzana
5
ans.translate( None, string.whitespace )hanya menghasilkan builtins.TypeError: translate() takes exactly one argument (2 given)untuk saya. Documents mengatakan bahwa argumen adalah tabel terjemahan, lihat string.maketrans (). Tetapi lihat komentar oleh Amnon Harel, di bawah ini.
user405
2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Catatan: lebih baik membuat variabel untuk menyimpan trans-tabel jika Anda bermaksud melakukan ini berulang kali.
Shogan Aversa-Druesne
16

Untuk menghapus spasi putih dari awal dan akhir, gunakan strip.

>> "  foo bar   ".strip()
"foo bar"
wal-o-mat
sumber
1
Pertanyaannya secara khusus meminta untuk menghapus semua spasi putih dan tidak hanya di ujungnya. Mohon diperhatikan.
Shayan Shafiq
9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaK sudah menunjukkan metode "terjemahkan" di atas. Dan variasi ini berfungsi dengan Python 3 (lihat T&J ini ).

Amnon Harel
sumber
2
Terima kasih! Atau, xxx.translate( { ord(c) :None for c in string.whitespace } )untuk ketelitian.
user405
7

Hati-hati:

strip melakukan rstrip dan lstrip (menghilangkan spasi, tab spasi, tab depan, dan umpan kembali, tetapi tidak menghapusnya di tengah-tengah string).

Jika Anda hanya mengganti spasi dan tab, Anda bisa berakhir dengan CRLF tersembunyi yang tampaknya cocok dengan yang Anda cari, tetapi tidak sama.

yan bellavance
sumber
3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)
PrabhuPrakash
sumber
3
pertanyaannya adalah menghapus semua spasi putih yang menyertakan tab dan karakter baris baru, cuplikan ini hanya akan menghapus spasi biasa.
Maximilian Peters
3

Selain itu, strip memiliki beberapa variasi:

Hapus spasi di AWAL dan AKHIR string:

sentence= sentence.strip()

Hapus spasi dalam AWAL string:

sentence = sentence.lstrip()

Hapus spasi di AKHIR string:

sentence= sentence.rstrip()

Ketiga fungsi string strip lstrip, dan rstripdapat mengambil parameter string untuk menghapus, dengan default menjadi semua ruang putih. Ini dapat membantu ketika Anda bekerja dengan sesuatu yang khusus, misalnya, Anda dapat menghapus hanya spasi tetapi tidak baris baru:

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

Atau Anda dapat menghapus koma tambahan saat membaca dalam daftar string:

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

menghilangkan semua spasi putih dari string, di kedua ujungnya, dan di antara kata-kata.

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

Python docs:

menangani
sumber
Saya tahu retelah disarankan sebelumnya, tetapi saya menemukan bahwa jawaban sebenarnya untuk judul pertanyaan agak tersembunyi di antara semua opsi lainnya.
Pegang