Che cosa esattamente fare “U” e “r” bandiere stringa fanno, e quali sono le stringhe letterali prime?

StackOverflow https://stackoverflow.com/questions/2081640

Domanda

Mentre chiedendo questa domanda , mi sono reso conto che non sapevo molto di stringhe raw. Per qualcuno che dichiara di essere un allenatore Django, questo fa schifo.

So quello che una codifica è, e so cosa u'' solo fa da quando ho capito che cosa è Unicode.

  • Ma che cosa r'' fare esattamente? Che tipo di stringa vuol provocare?

  • E, soprattutto, che diamine fa ur'' fare?

  • Infine, non v'è alcun modo affidabile per tornare indietro da una stringa Unicode per una semplice stringa crudo?

  • Ah, e dal modo in cui, se il vostro sistema e il vostro editor di testo set di caratteri sono impostati su UTF-8, non u'' effettivamente fare qualcosa?

È stato utile?

Soluzione

Non c'è davvero alcun "raw stringa "; ci sono prime stringhe letterali , che sono esattamente i valori letterali stringa contrassegnati con l''r' prima che la citazione di apertura.

Una "stringa raw letterale" è una sintassi leggermente diversa per una stringa letterale, in cui una barra inversa, \, è preso nel senso "solo una barra rovesciata" (tranne quando si tratta a destra prima di una citazione che altrimenti terminare il letterale ) - no "sequenze di escape" per rappresentare a capo, tabulazioni, backspace, form-feed, e così via. In normali stringhe, ogni backslash deve essere raddoppiato per evitare di essere preso come l'inizio di una sequenza di escape.

Questa variante sintassi esiste in gran parte perché la sintassi dei modelli di espressioni regolari è pesante con backslash (ma mai alla fine, in modo che il "eccezione" clausola di cui sopra non importa) e sembra un po 'meglio quando si evita di raddoppio ogni di loro - questo è tutto. E 'anche guadagnato una certa popolarità per esprimere i percorsi di file di Windows native (con barre rovesciate al posto delle barre normali come su altre piattaforme), ma che è molto raramente necessaria (dal momento che le barre normali per lo più funzionano bene anche su Windows) e imperfetta (a causa della "eccezione" clausola sopra).

r'...' è una stringa di byte (in Python 2. *), ur'...' è una stringa Unicode (ancora una volta, in Python 2. *), e uno qualsiasi degli altri tre tipi di citare anche produce esattamente gli stessi tipi di stringhe (così per esempio r'...', r'''...''', r"...", r"""...""" sono tutte le stringhe di byte, e così via).

Non sei sicuro di cosa si intende per "andare Indietro " - non c'è intrinsecamente indietro e direzioni in avanti, perché non c'è nessuna stringa prime Tipo , è solo una sintassi alternativa per esprimere oggetti stringa perfettamente normale, byte o Unicode in quanto potrebbero essere.

E sì, in Python 2. *, u'...' è , naturalmente sempre distinto da solo '...' - il primo è una stringa unicode, il secondo è una stringa di byte. Cosa che codifica per il letterale potrebbe essere espresso in è una questione del tutto ortogonale.

per esempio, prendere in considerazione (Python 2.6):.

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

L'oggetto Unicode ovviamente richiede più spazio di memoria (molto piccola differenza per un brevissimo stringa, ovviamente, -).

Altri suggerimenti

Ci sono due tipi di stringhe in Python: il tipo str tradizionale e il tipo di unicode più recente. Se si digita una stringa letterale, senza il u di fronte ad ottenere il vecchio tipo str che memorizza caratteri a 8-bit, e con la u di fronte si ottiene il tipo unicode più recente che può memorizzare qualsiasi carattere Unicode.

Il r non cambia il tipo a tutti, cambia solo il modo viene interpretata la stringa letterale. Senza il r, backslash vengono trattati come caratteri di escape. Con il r, backslash vengono trattati come letterale. In entrambi i casi, il tipo è lo stesso.

ur è, naturalmente, una stringa Unicode in cui backslash sono backslash letterali, non fa parte di codici di escape.

Si può cercare di convertire una stringa Unicode ad un vecchio stringa utilizzando la funzione di str(), ma se ci sono dei caratteri Unicode che non possono essere rappresentati nella vecchia stringa, si otterrà un'eccezione. li si potrebbe sostituire con i punti interrogativi prima se lo si desidera, ma naturalmente questo potrebbe causare quei personaggi siano illeggibili. Non è consigliabile utilizzare il tipo str se si desidera gestire correttamente i caratteri Unicode.

'stringa raw' significa che viene memorizzato come appare. Ad esempio, '\' è solo un backslash invece di un fuga .

A "u" prefisso denota il valore è di tipo unicode anziché str.

stringhe letterali prime, con un prefisso "r", sfuggire a qualsiasi sequenze di escape al loro interno, in modo da len(r"\n") è 2. perché sfuggono le sequenze di escape, non è possibile terminare una stringa letterale con una singola barra rovesciata: non è una sequenza valida escape ( ad esempio r"\").

"Raw" non fa parte del tipo, è semplicemente un modo per rappresentare il valore. Ad esempio, "\\n" e r"\n" sono valori identici, come 32, 0x20 e 0b100000 sono identici.

Si può avere Unicode stringhe letterali prime:

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

La codifica del file di origine determina solo come interpretare il file di origine, non influenza le espressioni o tipi altrimenti. Tuttavia, è raccomanda di evitare di codice in cui una codifica diversa da ASCII avrebbe cambiato il il che significa:

  

I file che utilizzano ASCII (o UTF-8, per Python 3.0) non dovrebbero avere un cookie di codifica. Latin-1 (o UTF-8) dovrebbero essere utilizzati solo quando un commento o docstring ha bisogno di citare il nome di un autore che richiede Latin-1; altrimenti, usando \ x, \ uo \ U sfugge è il modo preferito per includere dati non ASCII nelle stringhe.

Mi spiego semplicemente: In Python 2, è possibile memorizzare stringa in 2 tipi differenti.

Il primo è ASCII che è str tipo in pitone, utilizza 1 byte di memoria. (256 caratteri, memorizzerà alfabeti per lo più inglesi e simboli semplici)

Il secondo tipo è UNICODE che è unicode tipo in pitone, utilizza 2 byte di memoria. (65536 caratteri, quindi questo includono tutti i caratteri di tutte le lingue della terra)

Per impostazione predefinita, python preferiranno str tipo, ma se si desidera memorizzare stringa nel unicode digitare si può mettere u di fronte alla testo come u'text ' o è possibile farlo chiamando unicode (' testo ')

u è solo un modo breve per chiamare una funzione per lanciare str a unicode . Questo è tutto!

Ora r parte, si mette davanti al testo per dire al computer che il testo è un testo crudo, backslash non dovrebbe essere un personaggio in fuga. r '\ n' non creerà un carattere di nuova riga. E 'solo testo contenente 2 caratteri.

Se si desidera convertire str a unicode e il testo grezzo anche mettere in là, utilizzare ur perché ru solleverà un errore.

Ora, la parte importante:

Non è possibile memorizzare una barra inversa utilizzando r , è l'unica eccezione. Quindi questo codice produrrà errore: r '\'

Per memorizzare una barra rovesciata (uno solo) è necessario utilizzare '\\'

Se si desidera memorizzare più di 1 caratteri è ancora possibile utilizzare r come r '\\' produrrà 2 backslash come previsto.

Non so il motivo per cui r non funziona con uno stoccaggio barra rovesciata ma il motivo non viene descritta da nessuno ancora. Mi auguro che si tratta di un bug.

Forse questo è ovvio, forse no, ma si può fare la stringa '\' chiamando x = chr (92)

x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y   # True
x is y # False
letterali

stringhe Unicode

Unicode stringhe costanti (stringhe precedute da u) sono non più utilizzati in Python 3. Essi sono ancora valide, ma solo per scopi di compatibilità con Python 2.

prime stringhe letterali

Se si desidera creare una stringa letterale composto da soli caratteri facilmente tipizzabili come lettere inglesi o numeri, si può semplicemente digitare: 'hello world'. Ma se si desidera includere anche alcuni personaggi più esotici, dovrete usare qualche soluzione alternativa. Una delle soluzioni alternative sono Sequenze di escape . In questo modo si può ad esempio rappresentare una nuova linea nella stringa semplicemente aggiungendo due caratteri facilmente tipizzabili \n alla stringa letterale. Così, quando si stampa la stringa 'hello\nworld', le parole verranno stampate su righe separate. Questo è molto utile!

D'altra parte, ci sono alcune situazioni in cui si desidera creare una stringa letterale che contiene le sequenze di escape, ma non si vuole loro di essere interpretati da Python. Si desidera loro di essere raw . Guarda questi esempi:

'New updates are ready in c:\windows\updates\new'
'In this lesson we will learn what the \n escape sequence does.'

In tali situazioni si può semplicemente anteporre la stringa letterale con il carattere r in questo modo: r'hello\nworld' e nessun sequenze di escape saranno interpretati da Python. La stringa verrà stampato esattamente come è stato creato.

stringhe letterali Raw non sono completamente "raw"?

Molte persone si aspettano le stringhe letterali prime ad essere prima in un senso che "Qualsiasi cosa messa tra virgolette viene ignorato dal Python" . Quello non è vero. Python riconosce ancora tutte le sequenze di escape, semplicemente non interpretarli - lascia invariati, invece. Ciò significa che letterali a corda grezzo devono ancora essere validi stringhe letterali .

lessicale definizione di una stringa letterale:

string     ::=  "'" stringitem* "'"
stringitem ::=  stringchar | escapeseq
stringchar ::=  <any source character except "\" or newline or the quote>
escapeseq  ::=  "\" <any source character>

E 'chiaro che le stringhe letterali (crudo o meno) che contiene un carattere preventivo nuda: 'hello'world' o terminare con un backslash:. 'hello world\' non sono validi

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top