Come includere una citazione in una stringa Python grezza


91

Ritenere:

>>> r"what"ever"
SyntaxError: invalid syntax
>>> r"what\"ever"
'what\\"ever'

Quindi come otteniamo la citazione, ma non la barra?

E per favore non suggerire r'what"ever', perché allora la domanda diventa semplicemente come includere entrambi i tipi di citazioni?

Relazionato


Nel caso d'uso motivante per le stringhe grezze (espressioni regolari e altri casi in cui qualcosa di diverso da Python interpreta i backslash), il backslash va bene, perché verrà elaborato dal motore regex / qualunque motore. Questo non si applica a tutti i casi in cui potresti voler utilizzare stringhe grezze, ma assicurati di pensare se si applica al tuo caso d'uso prima di provare a rimuovere i backslash.
user2357112 supporta Monica

Risposte:


148

Se desideri utilizzare le virgolette doppie nelle stringhe ma non le virgolette singole, puoi invece utilizzare le virgolette singole come delimitatore:

r'what"ever'

Se hai bisogno di entrambi i tipi di virgolette nella tua stringa, usa una stringa tra virgolette triple:

r"""what"ev'er"""

Se vuoi includere entrambi i tipi di stringhe con virgolette triple nella tua stringa (un caso estremamente improbabile), non puoi farlo e dovrai usare stringhe non grezze con escape.


1
Eccellente. Mi ci è voluto un secondo per capire che potevo rendere grezze anche le stringhe con virgolette triple.
mpen

3
Mi piace anche l'ultimo paragrafo ... questo era esattamente quello che stavo cercando di capire. I limiti dei diversi stili di citazione. Sto confrontando Python r"raw string"e C # @"@-quoted string"e"""triple quotes"""
mpen

2
Python newb qui, un po 'confuso, non è r'what"ever"un errore di analisi? Volevi dire r'what"ever'?
nmr

1
Cosa c'è di sbagliato negli sviluppatori Python? Perché non hanno semplicemente implementato un sistema di fuga come fanno tutte le altre lingue?
Jamby

6
@ Jamby Hanno un sistema di escape, lo usi semplicemente con stringhe non grezze (stringhe senza la r davanti), e funziona praticamente come ogni altra lingua .
Coburn

10

Python ha più di un modo per eseguire le stringhe. La seguente sintassi delle stringhe consente di utilizzare le virgolette doppie:

'''what"ever'''

1
Ti sei perso la parte grezza della domanda.
mpen

10

Se hai bisogno di qualsiasi tipo di citazione (singola, doppia e tripla per entrambe) puoi "combinare" (0) le stringhe:

>>> raw_string_with_quotes = r'double"' r"single'" r'''double triple""" ''' r"""single triple''' """
>>> print raw_string_with_quotes
double"single'double triple""" single triple'''

Puoi anche "combinare" (0) stringhe grezze con stringhe non grezze:

>>> r'raw_string\n' 'non-raw string\n'
'raw_string\\nnon-raw string\n'

(0): In effetti, il parser Python unisce le stringhe e non crea più stringhe. Se aggiungi l'operatore "+", vengono create e combinate più stringhe.


5

Non importa, la risposta sono stringhe grezze tra virgolette:

r"""what"ever"""

3

Dato che sono incappato in questa risposta, e mi ha aiutato molto, ma ho trovato un piccolo problema sintattico, ho sentito che avrei dovuto salvare altri possibili frustrazioni. La stringa tra virgolette tripla funziona per questo scenario come descritto, ma nota che se il "che vuoi nella stringa si trova alla fine della stringa stessa:

somestr = """This is a string with a special need to have a " in it at the end""""

Si verificherà un errore durante l'esecuzione perché le "" "" (4) virgolette di fila confondono il lettore di stringhe, poiché pensa di aver già raggiunto la fine della stringa e quindi trova un "casuale" là fuori. Puoi convalidarlo inserendo uno spazio tra le 4 virgolette in questo modo: "" "" e non avrà l'errore.

In questo caso speciale dovrai utilizzare:

somestr = 'This.....at the end"'

oppure utilizzare il metodo sopra descritto di costruire più stringhe con miste "e 'e poi concatenarle dopo il fatto.


1

Solo per includere la nuova funzionalità compatibile con Python f String:

var_a = 10

f"""This is my quoted variable: "{var_a}". """

Le stringhe f supportano la fuga, no? Quindi puoi farlo f"foo\"bar".
mpen

-3

Uso:

dqote='"'
sqote="'"

Usa l'operatore "+" dqotee le squotevariabili per ottenere ciò di cui hai bisogno.

Se voglio sed -e s/",u'"/",'"/g -e s/^"u'"/"'"/, puoi provare quanto segue:

dqote='"'
sqote="'"
cmd1="sed -e s/" + dqote + ",u'" + dqote + "/" + dqote + ",'" + dqote + '/g -e s/^"u' + sqote + dqote + '/' + dqote + sqote + dqote + '/'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.