Come posso rimuovere tutti gli spazi in una stringa Python? Ad esempio, voglio che una stringa simile strip my spaces
venga trasformata in stripmyspaces
, ma non riesco a farlo con strip()
:
>>> 'strip my spaces'.strip()
'strip my spaces'
Come posso rimuovere tutti gli spazi in una stringa Python? Ad esempio, voglio che una stringa simile strip my spaces
venga trasformata in stripmyspaces
, ma non riesco a farlo con strip()
:
>>> 'strip my spaces'.strip()
'strip my spaces'
Risposte:
Sfruttando il comportamento di str.split senza parametro sep:
>>> s = " \t foo \n bar "
>>> "".join(s.split())
'foobar'
Se vuoi solo rimuovere gli spazi anziché tutti gli spazi bianchi:
>>> s.replace(" ", "")
'\tfoo\nbar'
Anche se l'efficienza non è l'obiettivo principale - la scrittura di un codice chiaro è - ecco alcuni tempi iniziali:
$ 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
Nota che regex è memorizzato nella cache, quindi non è così lento come immagini. Compilarlo in anticipo aiuta alcuni, ma importerebbe in pratica solo se lo chiamate molte volte:
$ 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
Anche se re.sub è 11.3x più lento, ricorda che i tuoi colli di bottiglia sono sicuramente altrove. La maggior parte dei programmi non noterebbe la differenza tra nessuna di queste 3 scelte.
\s+
sostituzione. Continuerei con re.
s.translate
metodo per caso? Probabilmente batte tutti i metodi mostrati in questa pagina.
None
- anche se, sorprendentemente, questo lo rende più lento ...
myString.translate(None, " \t\r\n\v")
. Ci vuole solo l'83% fino a quando la tecnica più veloce (dividi e unisci) di Roger. Non sono sicuro che copra tutti i caratteri degli spazi bianchi suddivisi, ma probabilmente sarà sufficiente per la maggior parte delle applicazioni ASCII.
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'
Gestisce anche tutti gli spazi bianchi a cui non stai pensando (credimi, ce ne sono molti).
In alternativa,
"strip my spaces".translate( None, string.whitespace )
Ed ecco la versione di Python3:
"strip my spaces".translate(str.maketrans('', '', string.whitespace))
NameError: name 'string' is not defined
.
import string
string1=" This is Test String to strip leading space"
print string1
print string1.lstrip()
string2="This is Test String to strip trailing space "
print string2
print string2.rstrip()
string3=" This is Test String to strip leading and trailing space "
print string3
print string3.strip()
string4=" This is Test String to test all the spaces "
print string4
print string4.replace(" ", "")
Prova una regex con re.sub
. Puoi cercare tutti gli spazi bianchi e sostituirli con una stringa vuota.
\s
nel tuo modello corrisponderà ai caratteri degli spazi bianchi e non solo uno spazio (tabulazioni, nuove righe, ecc.). Puoi leggere di più a riguardo nel manuale .
import re
re.sub(' ','','strip my spaces')
Come menzionato da Roger Pate, il seguente codice ha funzionato per me:
s = " \t foo \n bar "
"".join(s.split())
'foobar'
Sto usando Jupyter Notebook per eseguire il seguente codice:
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
Si applicano le tecniche standard per filtrare un elenco, sebbene non siano efficienti come i metodi split/join
o translate
.
Abbiamo bisogno di una serie di spazi bianchi:
>>> import string
>>> ws = set(string.whitespace)
Il filter
builtin:
>>> "".join(filter(lambda c: c not in ws, "strip my spaces"))
'stripmyspaces'
Una comprensione dell'elenco (sì, utilizzare le parentesi: vedere il punto di riferimento sotto):
>>> import string
>>> "".join([c for c in "strip my spaces" if c not in ws])
'stripmyspaces'
Una piega:
>>> import functools
>>> "".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))
'stripmyspaces'
Prova delle prestazioni:
>>> 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
TL / DR
Questa soluzione è stata testata utilizzando Python 3.6
Per rimuovere tutti gli spazi da una stringa in Python3 puoi usare la seguente funzione:
def remove_spaces(in_string: str):
return in_string.translate(str.maketrans({' ': ''})
Per rimuovere qualsiasi carattere di spazio ('\ t \ n \ r \ x0b \ x0c') puoi usare la seguente funzione:
import string
def remove_whitespace(in_string: str):
return in_string.translate(str.maketrans(dict.fromkeys(string.whitespace)))
Spiegazione
Il str.translate
metodo di Python è un metodo di classe incorporato di str, prende una tabella e restituisce una copia della stringa con ogni carattere mappato attraverso la tabella di traduzione passata. Documentazione completa per str.translate
Per creare la tabella di traduzione str.maketrans
viene utilizzato. Questo metodo è un altro metodo di classe incorporato di str
. Qui lo usiamo con un solo parametro, in questo caso un dizionario, in cui le chiavi sono i caratteri da sostituire mappati ai valori con il valore di sostituzione dei caratteri. Restituisce una tabella di traduzione da utilizzare con str.translate
. Documentazione completa per str.maketrans
Il string
modulo in Python contiene alcune operazioni e costanti di stringa comuni. string.whitespace
è una costante che restituisce una stringa contenente tutti i caratteri ASCII considerati spazi bianchi. Ciò include lo spazio dei caratteri, la scheda, l'avanzamento di riga, il ritorno, l'avanzamento del modulo e la scheda verticale. Documentazione completa per stringa
Nella seconda funzione dict.fromkeys
viene utilizzato per creare un dizionario in cui le chiavi sono i caratteri nella stringa restituiti da string.whitespace
ciascuno con valore None
. Documentazione completa per dict.fromkeys
Se le prestazioni ottimali non sono un requisito e vuoi semplicemente qualcosa di estremamente semplice, puoi definire una funzione di base per testare ogni carattere usando il metodo "isspace" della classe stringa:
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
Costruire la no_white_space
stringa in questo modo non avrà prestazioni ideali, ma la soluzione è facile da capire.
>>> remove_space('strip my spaces')
'stripmyspaces'
Se non si desidera definire una funzione, è possibile convertirla in qualcosa di vagamente simile con la comprensione dell'elenco. Prendendo in prestito dalla soluzione della risposta migliore join
:
>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'