2011-08-31 23 views
35

Ho letto una stringa da una casella di testo della GUI inserita dall'utente e l'ho elaborata tramite pandoc. La stringa contiene direttive in lattice per la matematica che hanno caratteri rovesciati. Voglio inviare la stringa come stringa raw a pandoc per l'elaborazione. Ma qualcosa come "\ theta" diventa una scheda e "heta".python: come convertire la stringa letterale in stringa raw letterale?

Come posso convertire un valore letterale stringa che contiene caratteri rovesciati in una stringa non elaborata ...?

Edit:

Grazie develerx, volando pecore e unutbu. Ma nessuna delle soluzioni sembra aiutarmi. Il motivo è che ci sono altri caratteri backslashed che non hanno alcun effetto in python ma che hanno un significato in latex.

Ad esempio "\ lambda". Tutti i metodi proposti prodotti

\\lambda 

, che non passa attraverso l'elaborazione in lattice - dovrebbe rimanere come \ lambda.

Un'altra modifica:

se posso ottenere questo lavoro, credo che dovrei essere attraverso. @ Mark: Tutti e tre i metodi danno risposte che non desidero.

a='\nu + \lambda + \theta'; 
b=a.replace(r"\\",r"\\\\"); 
c='%r' %a; 
d=a.encode('string_escape'); 
print a 

u + \lambda + heta 
print b 

u + \lambda + heta 
print c 
'\nu + \\lambda + \theta' 
print d 
\nu + \\lambda + \theta 
+0

Sei sicuro la stringa contiene davvero '\\ lambda' e non è solo il raddoppio quando lo si stampa? Prova a stampare 'mystring [1:]' e vedi se c'è ancora un '\' in esso. Ci dovrebbe essere una certa consistenza - se '\ t' si sta convertendo in tab allora' \\' dovrebbe convertirsi in '\'. –

+0

Puoi pubblicare il 'repr' della stringa come ricevuto dalla casella di testo della GUI e mostrare il codice che stai utilizzando per elaborarlo tramite pandoc? – unutbu

+0

Il tuo test non è realistico. Non lo ottieni da una casella di testo, lo stai impostando con una stringa letterale e Python lo ha già convertito in modo incoerente nel momento in cui è assegnato a 'a'. È impossibile recuperare il testo originale a quel punto. –

risposta

37

stringhe prime di Python sono solo un modo per dire l'interprete Python che deve interpretare i backslash come barre letterali. Se leggi le stringhe inserite dall'utente, hanno già superato il punto in cui avrebbero potuto essere crude. Inoltre, è molto probabile che l'input dell'utente venga letto letteralmente, ad esempio "raw".

Ciò significa che l'interpretazione avviene da qualche altra parte. Ma se sai che succede, perché non sfuggire alle barzellette per qualunque cosa lo stia interpretando?

s = s.replace("\\", "\\\\") 

(Si noti che non si può fare r"\" come “a raw string cannot end in a single backslash”, ma avrei potuto usare r"\\" così per il secondo argomento.)

Se questo non funziona, il vostro input dell'utente è per qualche la ragione arcana che interpreta i backslash, quindi avrai bisogno di un modo per dirgli di fermarlo.

+0

Questa è la prima volta che vedo "la stringa non può finire in una sola barra rovesciata". Non mi ero reso conto che l'analisi delle stringhe di Python fosse così hacky - pensavo che il prefisso 'r' intendesse smettere di trattare i backslash come speciali, invece significa emettere entrambi i caratteri invece di interpretarli. –

+0

@MarkRansom yeah, le stringhe di f sono anche solo la postelaborazione delle stringhe e non un sottoprocessore reale ... –

4
a='\nu + \lambda + \theta' 
d=a.encode('string_escape').replace('\\\\','\\') 
print(d) 
# \nu + \lambda + \theta 

Questo dimostra che v'è una singola barra rovesciata prima del n, l e t:

print(list(d)) 
# ['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a'] 

C'è qualcosa di strano sta succedendo con la vostra interfaccia grafica. Ecco un semplice esempio di acquisizione di input da parte dell'utente tramite Tkinter.Entry. Si noti che il testo recuperato ha una sola barra rovesciata prima di n, l e t.Così nessuna elaborazione supplementare dovrebbe essere necessario:

import Tkinter as tk 

def callback(): 
    print(list(text.get())) 

root = tk.Tk() 
root.config() 

b = tk.Button(root, text="get", width=10, command=callback) 

text=tk.StringVar() 

entry = tk.Entry(root,textvariable=text) 
b.pack(padx=5, pady=5) 
entry.pack(padx=5, pady=5) 
root.mainloop() 

Se si digita \nu + \lambda + \theta nella casella di immissione, la console (correttamente) di stampa:

['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a'] 

Se la vostra interfaccia grafica non restituisce risultati simili (come il tuo post sembra suggerire), quindi suggerirei di cercare nel risolvere il problema della GUI, piuttosto che andare in giro con string_escape e la stringa replace.

+0

che è bello se è python che interpreta la stringa. se è pandoc, potrebbe non funzionare. sai cosa (a parte i backslash) è fatto da 'string_escape'? forse fa troppo? –

+0

@flying sheep: I documenti dicono 'string_escape' [" produce una stringa che è adatta come stringa letterale nel codice sorgente Python. "] (Http://docs.python.org/library/codecs.html). AFAIK, 'string_escape' ha effetto sui backslash o sui caratteri backslash e nient'altro. Forse mi sbaglio. Sarei felice di sapere se fa di più. – unutbu

+0

non ne so più di te. molto probabilmente hai ragione. ma ancora: se il punto in cui avviene l'interpretazione mangia qualche escape (come '\ s' →' '), allora questo produrrà errori silenziosi. dovrebbe trovare la fonte. –

3

Quando si legge la stringa dal controllo della GUI, è già una stringa "raw". Se stampi la stringa potresti vedere raddoppiare i backslash, ma questo è un artefatto di come Python visualizza le stringhe; internamente c'è ancora un solo backslash.

>>> a='\nu + \lambda + \theta' 
>>> a 
'\nu + \\lambda + \theta' 
>>> len(a) 
20 
>>> b=r'\nu + \lambda + \theta' 
>>> b 
'\\nu + \\lambda + \\theta' 
>>> len(b) 
22 
>>> b[0] 
'\\' 
>>> print b 
\nu + \lambda + \theta 
0
import re 

matches = [] 
var = 'Hello, how are you?' 

search_term = 'how are' 


if re.search('\\b'+search_term+'\\b', var): 
    matches.append(search_term) 
    print matches 

else: 
    print 'false' 
6

Se si desidera convertire una stringa esistente a stringa cruda, allora possiamo riassegnare che, come di seguito

s1 = "welcome\tto\tPython"

raw_s1 = "%r"%s1

print(raw_s1)

stamperà

welcome\tto\tPython

+1

Credo che, almeno in Python3, questo in realtà stamperà: 'welcome \\ tto \\ tPython' - Compreso le virgolette singole. – disflux

+0

@disflux L'ho appena testato con Python 3.3.6 e stampato: '' >>> s1 = "benvenuto \ tto \ tPython" >>> raw_s1 = "% r"% s1 >>> stampa (raw_s1) 'welcome \ tto \ tPython''' – user

Problemi correlati