Cómo incluir una cita en una cadena de Python sin procesar

89

Considerar:

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

Entonces, ¿cómo obtenemos la cotización, pero no la barra?

Y por favor no sugiera r'what"ever', porque entonces la pregunta es cómo incluimos ambos tipos de citas.

Relacionado

mpen
fuente
En el caso de uso motivador para cadenas sin formato (expresiones regulares y otros casos en los que algo distinto de Python interpreta las barras invertidas), la barra invertida está bien, porque será procesada por el motor de expresiones regulares / cualquier motor. Esto no se aplica a todos los casos en los que es posible que desee utilizar cadenas sin procesar, pero asegúrese de pensar si se aplica a su caso de uso antes de intentar eliminar las barras diagonales inversas.
user2357112 apoya a Monica el

Respuestas:

146

Si desea usar comillas dobles en cadenas pero no comillas simples, puede usar comillas simples como delimitador en su lugar:

r'what"ever'

Si necesita ambos tipos de comillas en su cadena, use una cadena entre comillas triples:

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

Si desea incluir ambos tipos de cadenas entre comillas triples en su cadena (un caso extremadamente improbable), no puede hacerlo y tendrá que usar cadenas no crudas con escapes.

Adam Rosenfield
fuente
1
Excelente. Me tomó un segundo darme cuenta de que también podía hacer crudas las cadenas entre comillas triples.
mpen
3
También me gusta el último párrafo ... esto era exactamente lo que estaba tratando de averiguar. Las limitaciones de los diferentes estilos de citas. Estoy comparando Python r"raw string"y C # @"@-quoted string"y"""triple quotes"""
mpen
2
Python newb aquí, un poco confundido, ¿no es r'what"ever"un error de análisis? ¿Quiso decir r'what"ever'?
nmr
1
¿Qué pasa con los desarrolladores de Python? ¿Por qué no implementaron simplemente un sistema de escape como todos los demás idiomas?
Jamby
6
@Jamby Tienen un sistema de escape, solo se usa con cadenas no crudas (cadenas sin la r delante de ellas), y funciona como casi cualquier otro idioma .
Coburn
10

Python tiene más de una forma de hacer cadenas. La siguiente sintaxis de cadena le permitiría usar comillas dobles:

'''what"ever'''
Karl
fuente
Te perdiste la parte cruda de la pregunta.
mpen
10

Si necesita cualquier tipo de cita (simple, doble y triple para ambos) puede "combinar" (0) las cadenas:

>>> 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'''

También puede "combinar" (0) cadenas sin procesar con cadenas no sin procesar:

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

(0): De hecho, el analizador de Python une las cadenas y no crea varias cadenas. Si agrega el operador "+", se crean y combinan varias cadenas.

Bakuriu
fuente
5

No importa, la respuesta son cadenas crudas entre comillas triples:

r"""what"ever"""
mpen
fuente
3

Dado que me topé con esta respuesta, y me ayudó mucho, pero encontré un problema sintáctico menor, sentí que debería evitar la frustración de otros. La cadena entre comillas triples funciona para este escenario como se describe, pero tenga en cuenta que si el "que desea en la cadena aparece al final de la cadena en sí:

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

Obtendrá un error en la ejecución porque las comillas "" "" (4) en una fila confunden al lector de cadenas, ya que cree que ya ha llegado al final de la cadena y luego encuentra un "aleatorio". Puede validar esto insertando un espacio en las 4 comillas así: "" "" y no tendrá el error.

En este caso especial, deberá utilizar:

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

o use el método descrito anteriormente para construir múltiples cadenas con una mezcla de "y" y luego concatenarlas después del hecho.

charrold303
fuente
1

Solo para incluir la nueva funcionalidad compatible con Python f String:

var_a = 10

f"""This is my quoted variable: "{var_a}". """
ilusionx
fuente
Sin embargo, los f-strings admiten el escape, ¿no? Entonces puedes hacerlo f"foo\"bar".
mpen
-3

Utilizar:

dqote='"'
sqote="'"

Utilice el operador '+' dqotey las squotevariables y para obtener lo que necesita.

Si quiero sed -e s/",u'"/",'"/g -e s/^"u'"/"'"/, puedes probar lo siguiente:

dqote='"'
sqote="'"
cmd1="sed -e s/" + dqote + ",u'" + dqote + "/" + dqote + ",'" + dqote + '/g -e s/^"u' + sqote + dqote + '/' + dqote + sqote + dqote + '/'
zulfi123786
fuente