Cara menghapus semua spasi putih dari string


179

Bagaimana cara menghapus semua spasi dalam string python? Misalnya, saya ingin string ingin strip my spacesdiubah menjadi stripmyspaces, tetapi sepertinya saya tidak bisa menyelesaikannya dengan strip():

>>> 'strip my spaces'.strip()
'strip my spaces'

13
Perhatikan bahwa str.strip hanya memengaruhi spasi putih depan dan belakang.

Jawaban:


311

Mengambil keuntungan dari perilaku str.split tanpa parameter sep:

>>> s = " \t foo \n bar "
>>> "".join(s.split())
'foobar'

Jika Anda hanya ingin menghapus spasi alih-alih semua spasi putih:

>>> s.replace(" ", "")
'\tfoo\nbar'

Optimalisasi prematur

Meskipun efisiensi bukanlah tujuan utama — menulis kode yang jelas — adalah beberapa penetapan waktu awal:

$ python -m timeit '"".join(" \t foo \n bar ".split())'
1000000 loops, best of 3: 1.38 usec per loop
$ python -m timeit -s 'import re' 're.sub(r"\s+", "", " \t foo \n bar ")'
100000 loops, best of 3: 15.6 usec per loop

Perhatikan bahwa regex di-cache, jadi tidak lambat seperti yang Anda bayangkan. Mengkompilasi sebelumnya membantu beberapa, tetapi hanya penting dalam praktik jika Anda memanggil ini berkali- kali:

$ python -m timeit -s 'import re; e = re.compile(r"\s+")' 'e.sub("", " \t foo \n bar ")'
100000 loops, best of 3: 7.76 usec per loop

Meskipun re.sub lebih lambat 11,3x, ingat kemacetan Anda pasti di tempat lain. Sebagian besar program tidak akan melihat perbedaan antara 3 pilihan ini.


Mungkin lebih lambat dari pada \s+substitusi. Saya akan tetap dengan re.
OTZ

@OTZ: Anda mungkin terkejut, tetapi lihat catatan "ingat".

@Roger Hmm. menarik. Sudahkah Anda mencoba s.translatemetode ini? Mungkin mengalahkan semua metode yang ditampilkan di halaman ini.
OTZ

@Roger Pate: Anda tidak perlu argumen 'tabel' untuk menerjemahkan, bisa jadi None- walaupun, anehnya, itu membuatnya lebih lambat ...
martineau

1
Coba myString.translate(None, " \t\r\n\v"). Hanya membutuhkan 83% selama teknik Roger (split and join) tercepat. Tidak yakin apakah itu mencakup semua karakter spasi putih yang terpecah, tetapi mungkin cukup untuk sebagian besar aplikasi ASCII.
brianmearns

60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

Juga menangani karakter spasi putih yang tidak Anda pikirkan (percayalah, ada banyak).


3
Ini jauh lebih sedikit dari solusi daripada jawaban yang diterima.
John Smith

Ini lebih eksplisit daripada jawaban yang lain, jadi butuh kuenya.
Tristan

34

Kalau tidak,

"strip my spaces".translate( None, string.whitespace )

Dan ini adalah versi Python3:

"strip my spaces".translate(str.maketrans('', '', string.whitespace))

ini tampaknya yang paling pythonic. mengapa belum diunggulkan ke atas?
rbp

Kode Python 3 sebagai jawaban tidak berfungsi. Komentar dari @DanMenes sudah usang
igo

3
NameError: name 'string' is not defined.
Zelphir Kaltstahl

@ZelphirKaltstahl Anda harusimport string
Shahryar Saljoughi

13

Yang paling sederhana adalah menggunakan ganti:

"foo bar\t".replace(" ", "").replace("\t", "")

Atau, gunakan ekspresi reguler:

import re
re.sub(r"\s", "", "foo bar\t")

10

Hapus Spasi Mulai dengan Python

string1="    This is Test String to strip leading space"
print string1
print string1.lstrip()

Hapus Trailing atau End Spaces dengan Python

string2="This is Test String to strip trailing space     "
print string2
print string2.rstrip()

Hapus whiteSpaces dari Awal dan akhir string dengan Python

string3="    This is Test String to strip leading and trailing space      "
print string3
print string3.strip()

Hapus semua spasi dalam python

string4="   This is Test String to test all the spaces        "
print string4
print string4.replace(" ", "")

3

Coba regex dengan re.sub . Anda dapat mencari semua spasi putih dan menggantinya dengan string kosong.

\sdalam pola Anda akan cocok dengan karakter spasi putih - dan bukan hanya spasi (tab, baris baru, dll). Anda dapat membaca lebih lanjut tentang itu di manual .


Saya tidak tahu cara menggunakan regexes :(
nama pengguna salah

@wrongusername: Diperbarui dengan tautan ke halaman manual modul ulang.
Matthew Iselin

2
import re
re.sub(' ','','strip my spaces')

3
Selamat datang di SO. Meskipun kami berterima kasih atas jawaban Anda, akan lebih baik jika memberikan nilai tambahan di atas jawaban lainnya. Dalam hal ini, jawaban Anda tidak memberikan nilai tambahan, karena pengguna lain sudah memposting solusi itu. Jika jawaban sebelumnya bermanfaat bagi Anda, Anda harus memilihnya setelah Anda memiliki reputasi yang cukup
Maximilian Peters

Ini tidak menjawab pertanyaan "bagaimana menghapus semua ruang putih". Ini hanya menghapus spasi
Nick

2

Seperti yang disebutkan oleh Roger Pate, kode berikut berfungsi untuk saya:

s = " \t foo \n bar "
"".join(s.split())
'foobar'

Saya menggunakan Jupyter Notebook untuk menjalankan kode berikut:

i=0
ProductList=[]
while i < len(new_list): 
   temp=''                            # new_list[i]=temp=' Plain   Utthapam  '
   #temp=new_list[i].strip()          #if we want o/p as: 'Plain Utthapam'
   temp="".join(new_list[i].split())  #o/p: 'PlainUtthapam' 
   temp=temp.upper()                  #o/p:'PLAINUTTHAPAM' 
   ProductList.append(temp)
   i=i+2

2

Teknik standar untuk menyaring daftar berlaku, meskipun mereka tidak seefisien split/joinatau translatemetode.

Kami membutuhkan seperangkat ruang putih:

>>> import string
>>> ws = set(string.whitespace)

The filterbuiltin:

>>> "".join(filter(lambda c: c not in ws, "strip my spaces"))
'stripmyspaces'

Pemahaman daftar (ya, gunakan kurung: lihat patokan di bawah):

>>> import string
>>> "".join([c for c in "strip my spaces" if c not in ws])
'stripmyspaces'

Lipatan:

>>> import functools
>>> "".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))
'stripmyspaces'

Benchmark:

>>> from timeit import timeit
>>> timeit('"".join("strip my spaces".split())')
0.17734256500003198
>>> timeit('"strip my spaces".translate(ws_dict)', 'import string; ws_dict = {ord(ws):None for ws in string.whitespace}')
0.457635745999994
>>> timeit('re.sub(r"\s+", "", "strip my spaces")', 'import re')
1.017787621000025

>>> SETUP = 'import string, operator, functools, itertools; ws = set(string.whitespace)'
>>> timeit('"".join([c for c in "strip my spaces" if c not in ws])', SETUP)
0.6484303600000203
>>> timeit('"".join(c for c in "strip my spaces" if c not in ws)', SETUP)
0.950212219999969
>>> timeit('"".join(filter(lambda c: c not in ws, "strip my spaces"))', SETUP)
1.3164566040000523
>>> timeit('"".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))', SETUP)
1.6947649049999995

0

TL / DR

Solusi ini diuji menggunakan Python 3.6

Untuk menghapus semua spasi dari string di Python3 Anda dapat menggunakan fungsi berikut:

def remove_spaces(in_string: str):
    return in_string.translate(str.maketrans({' ': ''})

Untuk menghapus karakter spasi putih ('\ t \ n \ r \ x0b \ x0c') Anda dapat menggunakan fungsi berikut:

import string
def remove_whitespace(in_string: str):
    return in_string.translate(str.maketrans(dict.fromkeys(string.whitespace)))

Penjelasan

str.translateMetode Python adalah metode str-built class, dibutuhkan sebuah tabel dan mengembalikan salinan string dengan setiap karakter dipetakan melalui tabel terjemahan yang diteruskan.Dokumentasi lengkap untuk str.translate

Untuk membuat tabel terjemahan str.maketransdigunakan. Metode ini adalah metode kelas built-in lainnya str. Di sini kita menggunakannya dengan hanya satu parameter, dalam hal ini kamus, di mana tombol adalah karakter yang akan diganti dipetakan ke nilai dengan nilai penggantian karakter. Ini mengembalikan tabel terjemahan untuk digunakan bersama str.translate. Dokumentasi lengkap untuk str.maketrans

The stringmodul python berisi beberapa operasi string umum dan konstanta. string.whitespaceadalah konstanta yang mengembalikan string yang berisi semua karakter ASCII yang dianggap sebagai spasi putih. Ini termasuk spasi karakter, tab, umpan baris, kembali, umpan form, dan tab vertikal.Dokumentasi lengkap untuk string

Dalam fungsi kedua dict.fromkeysdigunakan untuk membuat kamus di mana tombol adalah karakter dalam string yang dikembalikan oleh string.whitespacemasing-masing dengan nilai None. Dokumentasi lengkap untuk dict.fromkeys


0

Jika kinerja optimal bukan persyaratan dan Anda hanya ingin sesuatu yang sederhana mati, Anda dapat menentukan fungsi dasar untuk menguji setiap karakter menggunakan metode "isspace" bawaan kelas string:

def remove_space(input_string):
    no_white_space = ''
    for c in input_string:
        if not c.isspace():
            no_white_space += c
    return no_white_space

Membangun no_white_spacestring dengan cara ini tidak akan memiliki kinerja yang ideal, tetapi solusinya mudah dimengerti.

>>> remove_space('strip my spaces')
'stripmyspaces'

Jika Anda tidak ingin mendefinisikan suatu fungsi, Anda dapat mengubahnya menjadi sesuatu yang agak mirip dengan pemahaman daftar. Meminjam dari joinsolusi jawaban teratas :

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.