2013-06-26 40 views
23

In python, sto provando a sostituire una sola barra retroversa ("\") con una doppia barra rovesciata ("\"). Ho il seguente codice:python sostituire una singola barra rovesciata con doppia barra rovesciata

directory = string.replace("C:\Users\Josh\Desktop\20130216", "\", "\\") 

Tuttavia, questo dà un messaggio di errore dicendo che non piace il doppio backslash. Qualcuno può aiutare?

+0

Non sara 'come la sola spalliera barre sia –

+0

un backspace è un [di fuga carattere] (http://docs.python.org/2/reference/lexical_analysis.html#grammar-token-escapeseq). Non puoi usarlo da solo. – Santa

+0

Puoi anche usare le barre in avanti; potrebbe essere più facile per te – squiguy

risposta

33

Non c'è bisogno di usare str.replace o string.replace qui, solo convertire che stringa in una stringa raw:

>>> strs = r"C:\Users\Josh\Desktop\20130216" 
     ^
      | 
     notice the 'r' 

Di seguito è la versione repr della stringa sopra, è per questo che si sta vedendo \\ qui. Ma, in effetti, la stringa attuale contiene solo '\' non \\.

>>> strs 
'C:\\Users\\Josh\\Desktop\\20130216' 

>>> s = r"f\o" 
>>> s   #repr representation 
'f\\o' 
>>> len(s) #length is 3, as there's only one `'\'` 
3 

Ma quando hai intenzione di stampare questa stringa non si otterrà '\\' nell'output.

>>> print strs 
C:\Users\Josh\Desktop\20130216 

Se si desidera la stringa per mostrare '\\' durante print quindi utilizzare str.replace:

>>> new_strs = strs.replace('\\','\\\\') 
>>> print new_strs 
C:\\Users\\Josh\\Desktop\\20130216 

repr versione mostrerà ora \\\\:

>>> new_strs 
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216' 
+0

Come ci si assicura che un '\\' esistente non venga raddoppiato? Per esempio. vuoi solo un massimo di double-backslash (nella versione 'print')? – Demis

+0

@Demis Puoi fare un esempio? –

+0

Ho uno script in cui ho bisogno che il percorso file memorizzato contenga double - \\ 's (da inviare a un programma che richiede questa escaping), ma il percorso del file di input a volte contiene già questo (fornito dall'utente/script Python), e a volte no (contiene solo single - \ 's). Voglio disinfettare l'input per assicurarmi che tutti i \ 's vengano convertiti esattamente \. Per esempio. L'utente potrebbe fornire \\ s se sono a conoscenza della sintassi \\ del programma, ma se non lo fanno, forniranno i singoli \. Potrei * richiedere solo il single - \ 's tutto il tempo, ma ho pensato che non sarebbe stato troppo difficile sanificarlo correttamente per entrambi i casi. – Demis

8

Utilizzare i caratteri di escape: "full\\path\\here", "\\" e "\\\\"

+1

Il modo in cui Python viene analizzato lessicale, 'r" \ "' o 'r" \\ "' non funzionerebbe come previsto. – Santa

+0

'r '\'' non è corretto, questo farà sorgere l'errore 'EOF' dato che in realtà stai sfuggendo alla citazione di chiusura. –

+0

cambiato ora. – alexpinho98

-2

Usa:

string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\") 

fuga il carattere \.

+1

L'ultimo argomento dovrebbe essere, '" \\\\ "'. – Santa

+0

Penso che tu intenda l'ultimo essere 'r '\\' o '\\\\' –

+1

Che senso ha usare una stringa grezza e poi applicarla. –

0

Forse un errore di sintassi nel tuo caso, è possibile modificare la linea a:

directory = str(r"C:\Users\Josh\Desktop\20130216").replace('\\','\\\\') 

che vi dà il diritto seguente output:

C:\\Users\\Josh\\Desktop\\20130216 
0

Data la stringa di origine, la manipolazione con os.path potrebbe avere più senso, ma qui è una soluzione d'archi;

>>> s=r"C:\Users\Josh\Desktop\\20130216" 
>>> '\\\\'.join(filter(bool, s.split('\\'))) 
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216' 

noti che split tratta il \\ nella stringa sorgente come una stringa vuota delimitata. L'utilizzo di filter elimina le stringhe vuote, pertanto join non raddoppierà i backslash già raddoppiati. Sfortunatamente, se ne hai 3 o più, vengono ridotti a backslash raddoppiati, ma non penso che ti faccia male nell'espressione di un percorso di Windows.

0

Il backslash indica un carattere di escape speciale. Pertanto, directory = path_to_directory.replace("\", "\\") indurrebbe Python a pensare che il primo argomento da sostituire non sia terminato fino alla citazione iniziale del secondo argomento poiché ha compreso la citazione finale come carattere di escape.

directory=path_to_directory.replace("\\","\\\\") 
6

Lascia che sia semplice e chiaro. Usiamo il modulo re in python per sfuggire ai caratteri speciali.

Python script:

import re 
s = "C:\Users\Josh\Desktop" 
print s 
print re.escape(s) 

uscita:

C:\Users\Josh\Desktop 
C:\\Users\\Josh\\Desktop 

Spiegazione:

Ora osserviamo che re.escape funzione sulla fuga dei caratteri speciali nella stringa data è in grado di aggiungere un altro backslash prima di ogni backslash, e infine l'output si traduce in una doppia barra rovesciata, l'output desiderato.

Spero che questo ti aiuti.

+0

Fornisci contesto e spiegazione per il tuo codice. Controlla anche la formattazione del tuo codice. –

+0

@JamesK Ci scusiamo per la spiegazione. Mi correggo. –

+1

È fantastico che ci sia una funzione per farlo per te! Questo è esattamente ciò di cui avevo bisogno, ed è molto più grazioso dei quadrupli backslash. In effetti semplice e chiaro. – Demis

2

In python \ (barra rovesciata) viene utilizzato come carattere di escape. Ciò significa che nei luoghi in cui si desidera inserire un carattere speciale (come nuova riga), si può usare il backslash e un altro personaggio (\n per nuova riga)

Con il vostro esempio pungere si nota che quando si mette "C:\Users\Josh\Desktop\20130216" in il repl si ottiene "C:\\Users\\Josh\\Desktop\x8130216". Questo perché \2 ha un significato speciale in una puntura di python. Se si desidera specificare \, è necessario inserire due \\ nella stringa.

"C:\\Users\\Josh\\Desktop\\28130216"

L'altra opzione è quella di informare python che tutto il pungiglione non deve utilizzare \ come carattere di escape da pre-attesa della puntura con r

r"C:\Users\Josh\Desktop\20130216"

Si tratta di un "raw "stringa, e molto utile in situazioni in cui è necessario utilizzare un sacco di backslash come con le punture di espressioni regolari.

Nel caso in cui ancora desidera sostituire quel singolo \ con \\ Si potrebbe quindi utilizzare:

directory = string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\\\")

Avviso che non sto usando r' negli ultimi due punture sopra. Questo perché, quando si utilizza il modulo r' di punture, non è possibile terminare la stringa con un unico \

Why can't Python's raw string literals end with a single backslash?

https://pythonconquerstheuniverse.wordpress.com/2008/06/04/gotcha-%E2%80%94-backslashes-are-escape-characters/

Problemi correlati