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'
nama pengguna salah
sumber
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.


sumber
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).

Tim Yates
sumber
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))
Dan Menes
sumber
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")
carl
sumber
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(" ", "")
JohnSmitoff
sumber
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 .

Matthew Iselin
sumber
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')
PrabhuPrakash
sumber
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
Yogesh
sumber
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
jferard
sumber
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

R. Arctor
sumber
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'
nBurn
sumber