stringhe - python convertire stringa in numero




Perché i letterali di stringa grezza di Python non possono finire con una singola barra rovesciata? (8)

Nonostante il suo ruolo, anche una stringa grezza non può finire in un singolo backslash, perché il backslash sfugge al seguente carattere di citazione: è ancora necessario sfuggire al carattere di citazione circostante per incorporarlo nella stringa. Cioè, r "... \" non è una stringa letterale valida: una stringa non valida può terminare con un numero dispari di barre retroverse. Se è necessario terminare una stringa non elaborata con una singola barra rovesciata, è possibile utilizzarne due e tagliarne la seconda.

Tecnicamente, qualsiasi numero dispari di backslash, come descritto nei documenti .

>>> r'\'
  File "<stdin>", line 1
    r'\'
       ^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
  File "<stdin>", line 1
    r'\\\'
         ^
SyntaxError: EOL while scanning string literal

Sembra che il parser possa solo trattare i backslash nelle stringhe non elaborate come caratteri normali (non è quello che sono le stringhe raw?), Ma probabilmente mi manca qualcosa di ovvio. TIA!


È così che va! Lo vedo come uno di quei piccoli difetti in python!

Non penso ci sia una buona ragione per farlo, ma sicuramente non sta analizzando; è davvero facile analizzare le stringhe non elaborate con \ come ultimo carattere.

Il problema è che, se permetti che sia l'ultimo carattere di una stringa raw, non sarai in grado di mettere "dentro una stringa raw. Sembra che Python sia andato con il permesso" invece di consentire \ come ultimo carattere.

Tuttavia, questo non dovrebbe causare alcun problema.

Se sei preoccupato di non essere in grado di scrivere facilmente percorsi di cartelle di Windows come c:\mypath\ allora non preoccuparti, per, puoi rappresentarli come r"C:\mypath" , e, se hai bisogno di aggiungere una sottodirectory nome, non farlo con concatenazione di stringhe, perché non è il modo giusto di farlo comunque! utilizzare os.path.join

>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\\mypath\\subfolder'

Il motivo è spiegato nella parte di quella sezione che ho evidenziato in grassetto:

Le virgolette possono essere sfuggite con una barra rovesciata, ma la barra inversa rimane nella stringa; ad esempio, r"\"" è un letterale stringa valido composto da due caratteri: una barra rovesciata e una virgoletta doppia; r"\" non è un letterale stringa valido (anche una stringa non valida può terminare con un numero dispari di barre retroverse). In particolare, una stringa non può terminare in una singola barra rovesciata (poiché la barra rovesciata sfuggirebbe al seguente carattere di citazione). Si noti inoltre che una singola barra rovesciata seguita da una nuova riga viene interpretata come quei due caratteri come parte della stringa, non come una continuazione di riga. .

Quindi le stringhe non elaborate non sono al 100% crude, c'è ancora qualche rudimentale processo di backslash.


Il motivo per cui r'\' è sintatticamente errato è che sebbene l'espressione stringa sia grezza, le virgolette utilizzate (singole o doppie) devono sempre essere di escape poiché altrimenti segnerebbero la fine della citazione. Quindi se vuoi esprimere una singola citazione all'interno di una singola stringa quotata, non c'è altro modo che usare \' . Lo stesso vale per le virgolette.

Ma potresti usare:

'\\'

Per poter terminare una stringa non elaborata con una barra, ti suggerisco di utilizzare questo trucco:

>>> print r"c:\test"'\\'
test\

Poiché \ "è consentito all'interno della stringa raw. Quindi non può essere utilizzato per identificare la fine della stringa letterale.

Perché non smettere di analizzare la stringa letterale quando incontri il primo "?

In tal caso, quindi, "\" non sarebbe consentito all'interno della stringa letterale, ma lo è.


Un altro utente che ha cancellato la propria risposta (non è sicuro se vorrebbe essere accreditato) ha suggerito che i progettisti di linguaggio Python potrebbero essere in grado di semplificare la progettazione del parser utilizzando le stesse regole di parsing ed espandendo i caratteri di escape alla forma grezza come un ripensamento (se il letterale è stato contrassegnato come grezzo).

Ho pensato che fosse un'idea interessante e la sto includendo come wiki della comunità per i posteri.


alcuni suggerimenti :

1) se hai bisogno di manipolare il backslash per il percorso, allora il modulo standard python os.path è tuo amico. per esempio :

os.path.normpath ( 'c: / cartella1 /')

2) se vuoi costruire stringhe con la barra rovesciata, MA senza barra inversa alla FINE della tua stringa, allora la stringa grezza è tuo amico (usa il prefisso 'r' prima della stringa letterale). per esempio :

r'\one \two \three'

3) se hai bisogno di prefissare una stringa in una variabile X con una barra rovesciata, puoi farlo:

X='dummy'
bs=r'\ ' # don't forget the space after backslash or you will get EOL error
X2=bs[0]+X  # X2 now contains \dummy

4) se è necessario creare una stringa con una barra rovesciata alla fine, combinare i suggerimenti 2 e 3:

voice_name='upper'
lilypond_display=r'\DisplayLilyMusic \ ' # don't forget the space at the end
lilypond_statement=lilypond_display[:-1]+voice_name

ora lilypond_statement contiene "\DisplayLilyMusic \upper"

lunga vita a Python! :)

n3on





literals