2010-02-01 27 views
17

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]

+0

Conoscere niente di niente su Python: stringa = string.replace ('&', '&') ... forse il metodo di sostituzione eviterà quella e commerciale per te ... heh – iandisme

+6

Se usi ancora SO, segna una soluzione! – erikbwork

+0

@Veedrac: in che modo questa domanda di 4 anni è contrassegnata come duplicato di una domanda posta 6 giorni fa? – User

risposta

17

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__() 
'\\' 
3

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.

55

Il risultato '\\&' viene visualizzato solo - in realtà la stringa è \&:

>>> str = '&' 
>>> new_str = str.replace('&', '\&') 
>>> new_str 
'\\&' 
>>> print new_str 
\& 

provare in un guscio.

+7

Perché questo non è contrassegnato come soluzione? – erikbwork

5
>>> '\\&' == '\&' 
True 
>>> len('\\&') 
2 
>>> print('\\&') 
\& 

O in altre parole: '\\&' contiene una sola barra rovesciata. È appena scappato nell'output della shell Python per chiarezza.

12

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 .

+0

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!). –

+0

@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. –

1

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) 
\& 
Problemi correlati