Ho bisogno di sfuggire a un carattere &
(e commerciale) in una stringa. Il problema è ogni volta che I string = string.replace ('&', '\&')
il risultato è '\\&'
. Viene aggiunta una barra rovesciata in più per evitare la barra rovesciata originale. Come rimuovere questa barra rovesciata extra?Aggiunta di barre rovesciate senza escaping [Python]
risposta
La barra rovesciata in più non viene effettivamente aggiunta; è appena aggiunto dalla funzione repr()
per indicare che si tratta di una barra rovesciata letterale. L'interprete Python utilizza la funzione repr()
(che chiama __repr__()
sull'oggetto) quando il risultato di un'espressione deve essere stampato:
>>> '\\'
'\\'
>>> print '\\'
\
>>> print '\\'.__repr__()
'\\'
Non v'è alcuna barra rovesciata aggiuntiva, è solo formattato in questo modo in un ambiente interattivo. Prova:
print string
allora si può vedere che non c'è davvero nessuna barra rovesciata aggiuntiva.
Il risultato '\\&'
viene visualizzato solo - in realtà la stringa è \&
:
>>> str = '&'
>>> new_str = str.replace('&', '\&')
>>> new_str
'\\&'
>>> print new_str
\&
provare in un guscio.
Perché questo non è contrassegnato come soluzione? – erikbwork
>>> '\\&' == '\&'
True
>>> len('\\&')
2
>>> print('\\&')
\&
O in altre parole: '\\&'
contiene una sola barra rovesciata. È appena scappato nell'output della shell Python per chiarezza.
Python tratta \
nella stringa letterale in un modo speciale.
Questo è così è possibile digitare '\n'
significare nuova riga o '\t'
significare scheda
Dal '\&'
non significa nulla di speciale per Python, invece di provocare un errore, l'analizzatore lessicale Python aggiunge implicitamente l'extra \
per tu.
in realtà è meglio usare \\&
o r'\&'
invece di '\&'
Il r
qui significa stringa prime e significa che \
non è trattata in modo speciale a meno che non sia giusto prima del carattere preventivo all'inizio del stringa.
Nella console interattiva, Python utilizza repr
per visualizzare il risultato, ecco perché viene visualizzato il doppio '\'. Se print
la stringa o utilizzare len(string)
vedrete che è davvero solo i 2 caratteri
Alcuni esempi
>>> 'Here\'s a backslash: \\'
"Here's a backslash: \\"
>>> print 'Here\'s a backslash: \\'
Here's a backslash: \
>>> 'Here\'s a backslash: \\. Here\'s a double quote: ".'
'Here\'s a backslash: \\. Here\'s a double quote: ".'
>>> print 'Here\'s a backslash: \\. Here\'s a double quote: ".'
Here's a backslash: \. Here's a double quote ".
per chiarire il punto di Peter fa nel suo commento vedere this link
differenza Standard C, tutte le sequenze di escape non riconosciute rimangono nella stringa invariate, ovvero la barra rovesciata rimane nella stringa.(Questo comportamento è utile durante il debug: se una fuga sequenza viene digitata male, il risultante uscita viene più facilmente riconosciuta come rotture.) È anche importante notare che le sequenze di escape contrassegnate come “(Unicode solo)” nella tabella sopra rientrano nella categoria degli escape non riconosciuti per i valori letterali della stringa non Unicode .
Parte di questo non è corretta. Python * non * "aggiunge implicitamente" \ "per te in più. Tuttavia, raddoppia il backslash quando si visualizza l'output repr() della stringa, come al prompt, puramente per scopi di presentazione. len ("\ &") è solo 2, dimostrando che non vi sono munging impliciti dei tuoi dati (grazie a Dio!). –
@PeterHansen Penso che l'OP indichi che i blackslash dovrebbero normalmente essere sottoposti a escape in stringhe non raw, quindi normalmente sarebbe scritto in doppio. –
la stampa di una lista può anche causare questo problema (im nuovo in python, quindi mi ha confuso un po 'troppo):
>>>myList = ['\\']
>>>print myList
['\\']
>>>print ''.join(myList)
\
simile:
>>>myList = ['\&']
>>>print myList
['\\&']
>>>print ''.join(myList)
\&
- 1. Codifica JSON con barre rovesciate
- 2. Utilizzo delle barre rovesciate nelle abbreviazioni vim
- 3. escaping le barre in avanti in elasticsearch
- 4. Sostituire all'indietro barre con in avanti riduce considerevolmente o doppie barre rovesciate in C++
- 5. Escaping automatico di barre in m4 per comandi shell
- 6. barre rovesciate "\" aggiunte nella stringa JSON per il servizio web in swift
- 7. Escaping di stringhe JavaScript in Python
- 8. Aggiunta elemento dinamico e barre di scorrimento
- 9. ottenere data senza barre
- 10. due barre in Python
- 11. Escaping di barre in jQuery per il passaggio di percorsi in una richiesta AJAX
- 12. Aggiunta di barre di errore su un grafico a barre in gnuplot
- 13. Aggiunta di barre di errore a un diagramma a barre con più gruppi
- 14. Python: escaping di stringhe da utilizzare in XML
- 15. Aggiunta di etichette al grafico a barre ggplot
- 16. Aggiunta di due barre degli strumenti AppCompat con temi diversi
- 17. Python - metaclasse - aggiunta di proprietà
- 18. Abilitazione barre di scorrimento del browser dopo window.open con barre di scorrimento = senza
- 19. Aggiunta di librerie python all'ambiente datalab google
- 20. Aggiunta dell'etichetta su un grafico a barre D3
- 21. Escaping citazioni e virgolette
- 22. Escaping HTML in Rails
- 23. citazioni Escaping in Jinja2
- 24. Bash - Escaping comandi SSH
- 25. Escaping data - stripslash, strip_tags
- 26. Escaping correttamente delle stringhe
- 27. Escaping stringhe letterali
- 28. Aggiunta di riferimenti senza Visual Studio
- 29. Aggiunta di una chiave RSA senza sovrascrivere
- 30. URL/HTML Escaping/Encoding
Conoscere niente di niente su Python: stringa = string.replace ('&', '&') ... forse il metodo di sostituzione eviterà quella e commerciale per te ... heh – iandisme
Se usi ancora SO, segna una soluzione! – erikbwork
@Veedrac: in che modo questa domanda di 4 anni è contrassegnata come duplicato di una domanda posta 6 giorni fa? – User