2012-12-02 18 views
11

Voglio rimuovere tutti gli spazi da una stringa.Modo preferito per rimuovere spazi bianchi da una stringa

"come fa sdf sdfsdf"

Il risultato sarebbe:

"asfasdfsdfsdf"

Ci sono diversi modi che posso pensare di raggiungere questo obiettivo, e mi sto chiedendo quale sia il migliore

1.

"".join(" as fa sdf sdfsdf ".split()) 

2.

" as fa sdf sdfsdf ".replace(" ", "") 

e presumo che ci sono più.
Quale preferisci?

+0

opzione 2 sembra buono per me. – xagyg

risposta

6

Credo che il metodo migliore e più efficace è la seconda versione, " as fa sdf sdfsdf ".replace(" ", ""), come prova è possibile utilizzare il modulo timeit:

  • python -m timeit '"".join(" as fa sdf sdfsdf ".split())'

    1000000 loops, best of 3: 0.554 usec per loop

  • python -m timeit '" as fa sdf sdfsdf ".replace(" ", "")'

    1000000 loops, best of 3: 0.405 usec per loop

+0

Penso che tu intenda "iterazione (i)"? – Thomas

0

Regex è semplice e funziona. split() è leggermente più complicato. Regex è preferito su split().

+0

Sono assolutamente d'accordo. Ma la domanda non riguardava la regex. –

+0

oops. Stavo pensando a java quando ho risposto a questo. – hologram

4

replace(" ", "") è il più chiaro e più sintetico.

+2

+1. Questa opzione dovrebbe essere scelta perché descrive in modo molto chiaro l'intento *. (Si desidera "allontanare gli spazi", non si desidera "dividere e unire la stringa con separatori diversi"). – Heinzi

2

Utilizzando replace non rimuoverà tutti i caratteri di spaziatura (ad esempio, a capo, tabs):

>>> 'abc\t\ndef'.replace(" ", "") 
'abc\t\ndef' 

preferisco string.translate:

>>> import string 
>>> 'abc\t\ndef'.translate(None, string.whitespace) 
'abcdef' 

EDIT: string.translate non funziona per le stringhe Unicode; potresti invece utilizzare re.sub('\s', '', 'abc\n\tdef').

+0

Penso che questo metodo meriti più riconoscimento (vale a dire che dovrei leggere la documentazione del modulo stringa). :) – Talvalin

+0

@martineau, no, 'string.translate' purtroppo non funziona con le stringhe Unicode (o funziona affatto per la cancellazione in Python 3). –

+0

@ SamuelIsaacson, errato. Python 3: ''abc \ t \ ndef'.translate (str.maketrans (' ',' ', string.whitespace))'. Le chiavi del dizionario devono essere valori ordinali Unicode (interi), non caratteri. –

1

re.sub(" ","", s) è il mio preferito.

+0

per una sostituzione singolo char? ahi ... –

4

Utilizzare questo per la rimozione di tutti gli spazi bianchi in una volta:

import re 

s = ' as fa sdf sdfsdf ' 
s = re.sub(r'\s+', '', s) 

s 
=> 'asfasdfsdfsdf' 

Il vantaggio di questo approccio è che elimina tutti gli spazi in-tra i personaggi - uno, due, non importa quanti ce ne sono, perché l'espressione regolare r'\s+' partite "uno o più" spazi bianchi - tra cui spazi, tabulazioni, ecc

+0

Ma una sostituzione regolare guarderà ogni lettera una alla volta e compirà lo stesso compito di rimuovere tutti gli spazi. Probabilmente più efficiente a causa della minore complessità computazionale. –

+1

dipende dal tuo scenario, potresti prendere in considerazione altri tipi di spazi come \ r, \ n, \ t tab, o alcuni spazi molto strani come questo - "" in Unicode. Detto questo, bisogna considerare molto di più: potresti voler avere una lista bianca invece di una lista cattiva. – HelloSam

2

espressione regolare

>>> str = " as fa sdf sdfsdf " 
>>> import re 
>>> re.sub(r'\s', '', str) 
+1

+1 perché supporta unicode e rimuove tutti i tipi di spazi bianchi non solo caratteri di spazio (e nonostante il fatto che 'str' è stato usato come un nome di variabile che nasconde il built-in di tipo con lo stesso nome). – martineau

1

Proprio gettare un altro nel mix:

from string import whitespace 
ws = set(whitespace) 
''.join(ch for ch in my_string if ch not in ws) 
+0

''' .join (ch per ch in my_string se non ch.isspace())' –

Problemi correlati