2011-08-22 15 views
5

A volte ho delle stringhe con strani personaggi. Non sono visibili nel browser, ma fanno parte della stringa e vengono contati in len(). Come posso liberarmene? Strip() cancella lo spazio normale ma non i segni.Python - come eliminare i segni nascosti dalla stringa?

+0

Vedere questa soluzione: http://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python –

risposta

2

Collect set di caratteri che si desidera attivare e rimuovere il resto come questo

import re 
text = re.sub("[^a-z0-9]+","", text, flags=re.IGNORECASE)

sarà rimuovere eventuali caratteri diversi da a alla z, dalla A alla Z e da 0 a 9.

+0

Ho bisogno pieni segni utf8 set:/ – robos85

+0

@ robos85, è bisogno di alcune informazioni per spogliare o non spogliare. quindi posso presumere che è necessario rimuovere tutti i caratteri non validi per utf8? c'è una soluzione per questo, ma che potrebbe includere caratteri non visibili/non stampabili. – YOU

11

Usa le categorie di caratteri dal modulo string. Se si desidera consentire tutti i caratteri stampabili, si può fare

from string import printable 
new_string = ''.join(char for char in the_string if char in printable) 

Sulla risposta di voi, si può fare questo con re.sub troppo:

new_string = re.sub("[^{}]+".format(printable), "", the_string) 

Inoltre, se si desidera visualizzare tutti i personaggi in una stringa, anche quelli non stampabili, si può sempre fare

print repr(the_string) 

che vi mostrerà le cose come \x00 per i caratteri non stampabili.

+0

Sicuramente questa è la risposta corretta. – dotancohen

+0

La risposta dei secondi ha funzionato come un incanto, grazie. – Yehonatan

1

Le espressioni regolari sono uno strumento valido e molto universale per tutti i tipi di analisi delle stringhe. Se la velocità è un problema, il metodo "translate" della classe string può aiutarti anche tu.

In primo luogo si definisce una mappatura ('identità'), che non cambierà nulla:

mapping = map(chr, range(256)) 

se si desidera sostituire ogni "a" da una "b", si modifica la mappatura

mapping[ord('a')] = 'b' 

Ora è costruire la tabella per il metodo "tradurre":

table = "".join(mapping) 

e

print "abc".translate(table) 

stampe "bbc".

Se davvero si vuole cancellare la "a", non si modificano la mappatura di cui sopra, costruire la tabella e quindi chiamare traducono nel seguente modo:

print "abc".translate(table, "a") 

ti dà "bc".

Una volta creata la tabella, il metodo di traduzione è molto veloce.

Quindi nel tuo caso è possibile modificare la mappatura in modo tale che tutti i tuoi personaggi indesiderati vengono mappati a uno spazio bianco

mapping = map(chr, range(256)) 
table = "".join(" " if c in unwanted_chars else c for c in map(chr, range(256))) 

e utilizzare len("my string".translate(table).trim()) che ignora i caratteri indesiderati all'inizio e alla fine della stringa.

Oppure si utilizza len("my string".translate(table, unwanted_chars)) che ignorerà tutti i caratteri indesiderati.

+0

Bello. +1 domani quando ho di nuovo voti. Ho pensato a tradurre ma ero troppo pigro per cercare la sintassi. – agf

Problemi correlati