2010-04-07 19 views
20

Ho dei problemi con un problema di stringhe molto semplice in Python (che non riesco a capire). Fondamentalmente, io sto cercando di fare quanto segue:Rimozione di spazi non interrompibili dalle stringhe usando Python

'# read file into a string 
myString = file.read() 

'# Attempt to remove non breaking spaces 
myString = myString.replace("\u00A0"," ") 

'# however, when I print my string to output to console, I get: 
Foo **<C2><A0>** Bar 

Ho pensato che il "\ u00A0" è stato il codice di escape per gli spazi non Unicode di rottura, ma a quanto pare non sto facendo questo in modo corretto. Qualche idea su cosa sto facendo male?

+2

Quale versione di Python stai usando (la risposta potrebbe differire a seconda che tu stia usando 2.x o 3.x)? –

+0

Ciao Kathy, sì sto usando Python v2.5.1 – dontsaythekidsname

+0

Modificato la mia risposta in risposta. –

risposta

0

Non c'è alcuna indicazione in quello che scrivi che stai necessariamente facendo qualcosa di sbagliato: se la stringa originale aveva uno spazio non interrotto tra "Foo" e "Bar", ora hai invece uno spazio normale lì. Ciò presuppone che a un certo punto hai decodificato la tua stringa di input (che immagino sia un test, a meno che tu non stia utilizzando Python 3 o con una funzione dal modulo codecs), altrimenti sei improbabile per individuare un carattere unicode in una stringa di byte non unicode, ai fini dello replace. Ma ancora, non ci sono chiare indicazioni di problemi in ciò che scrivi.

Può chiarire qual è l'ingresso (stampare repr(myString) poco prima della sostituzione) e qual è l'uscita (stampa repr(myString) di nuovo solo dopo la sostituzione) e perché si pensa che sia un problema? Senza lo repr, le stringhe che sono effettivamente diverse potrebbero guardare allo stesso modo ma repr aiuta.

4

No, u"\u00A0" è il codice di escape per spazi non interrotti. "\u00A0" è di 6 caratteri che non sono alcun tipo di codice di escape. Read this.

+0

Grazie per il link Ignacio! – dontsaythekidsname

+1

Il link che hai fornito potrebbe essere buono per un principiante ma è fuorviante. Trascura completamente la normalizzazione Unicode, ad es., '' Ć'' è 'u' \ u0107'' e potrebbe essere rappresentato come 'u'c \ u0301'' http://unicode.org/reports/tr15/ – jfs

34

Non hai una stringa unicode, ma un elenco di byte UTF-8 (che sono le stringhe in Python 2.x).

Prova

myString = myString.replace("\xc2\xa0", " ") 

Meglio sarebbe per passare a Unicode - vedi this article per le idee. Così si potrebbe dire

uniString = unicode(myString, "UTF-8") 
uniString = uniString.replace(u"\u00A0", " ") 

e dovrebbe funzionare anche (avvertimento: non ho Python 2.x disponibili in questo momento), anche se sarà necessario di tradurre di nuovo a byte (binario) quando si invia a un file o stamparlo su uno schermo.

+1

La tua soluzione era molto utile. Grazie! – Rokujolady

+0

La tua soluzione UTF-8 era esattamente ciò di cui avevo bisogno per ottenere uno spazio senza interruzione in un file di registro. Sebbene l'output sembri strano quando il logger fa eco al log record della console, che non è UTF-8, ovviamente, sembra strano, ma diventa completamente invisibile nel file di log, facendolo apparire esattamente come mi serviva, con una riga vuota sopra le etichette della colonna. –

0

Si prega di notare che un semplice myString.strip() rimuoverà non solo spazi, ma anche spazi non spezzati dall'inizio e dalla fine di myString. Non esattamente quello che l'OP chiedeva, ma ancora molto utile in molti casi.

Problemi correlati