¿Cómo escapar de la barra invertida y comillas simples o dobles en Python?

Cómo escapar de una barra diagonal inversa y una comilla simple o comilla doble en python Por ejemplo:

Long string = '''some 'long' string \' and \" some 'escaped' strings''' value_to_change = re.compile( A EXPRESION TO REPRESENT \' and \" ) modified = re.sub(value_to_change , 'thevalue' , Long_string ) ## Desired Output modified = '''some 'long' string thevalue and thevalue some 'escaped' strings''' 

Gracias en avanzado!

Como lo hiciste

Si su “cadena larga” se lee desde un archivo (como menciona en un comentario), entonces su pregunta es engañosa. Como obviamente no entiendes cómo funciona el escape, la pregunta tal como la escribiste probablemente sea diferente de la pregunta que realmente tienes.

Si estos son los contenidos de su archivo (51 bytes como se muestra + quizás uno o dos caracteres de fin de línea):

 some 'long' string \' and \" some 'escaped' strings 

entonces esto es lo que se verá en python:

 >>> s1 = open('data.txt', 'r').read().strip() >>> s1 'some \'long\' string \\\' and \\" some \'escaped\' strings' >>> print s1 some 'long' string \' and \" some 'escaped' strings 

Lo que escribiste en la pregunta producirá:

 >>> s2 = '''some 'long' string \' and \" some 'escaped' strings''' >>> s2 'some \'long\' string \' and " some \'escaped\' strings' >>> print s2 some 'long' string ' and " some 'escaped' strings >>> len(s) 49 

¿Ves la diferencia?

No hay barras invertidas en s2 porque tienen un significado especial cuando las usas para escribir cadenas en Python. No tienen un significado especial cuando los lees de un archivo.

Si desea escribir una cadena que luego tiene una barra invertida, debe proteger la barra invertida que ingresa. Tienes que evitar que Python piense que tiene un significado especial. Lo haces escapando con una barra invertida.

Una forma de hacer esto es usar barras invertidas, pero a menudo la forma más fácil y menos confusa es usar cadenas en bruto:

 >>> s3 = r'''some 'long' string \' and \" some 'escaped' strings''' 'some \'long\' string \\\' and \\" some \'escaped\' strings' >>> print s3 some 'long' string \' and \" some 'escaped' strings >>> s1 == s3 True 

Como lo dijiste

Lo anterior fue solo para mostrarle que su pregunta fue confusa.

La respuesta real es un poco más difícil: cuando se trabaja con expresiones regulares, la barra invertida adquiere otra capa de significado especial. Si desea obtener de forma segura una barra invertida a través de la cadena que se escapa y de la expresión regular que se escapa a la expresión regular real, debe anotar varias barras diagonales inversas en consecuencia.

Además, las reglas para poner comillas simples ( ' ) en cadenas sin formato entre comillas simples ( r'' ) también son un poco difíciles, así que usaré una cadena en bruto con comillas simples triples ( r'''''' ).

 >>> print re.sub(r'''\\['"]''', 'thevalue', s1) some 'long' string thevalue and thevalue some 'escaped' strings 

Las dos barras diagonales inversas permanecen dos barras diagonales inversas a lo largo de la cadena y luego se convierten en una única barra invertida sin un significado especial a través de la expresión regular. En total, la expresión regular dice: “haga coincidir una barra invertida seguida de una comilla simple o una comilla doble”.

Como se debe hacer

Ahora, para la pieza de resistencia: lo anterior es realmente una buena demostración de lo que significa jwz 1 . Si te olvidas de las expresiones regulares (y conoces las cadenas en bruto), la solución se vuelve mucho más obvia:

 >>> print s1.replace(r'\"', 'thevalue').replace(r"\'", 'thevalue') some 'long' string thevalue and thevalue some 'escaped' strings 

1 Algunas personas, cuando se enfrentan a un problema, piensan “Lo sé, usaré expresiones regulares”. Ahora ellos tienen dos problemas.

¿Es esto lo que quieres?

 import re Long_string = "some long string \' and \" some escaped strings" value_to_change = re.compile( "'|\"" ) modified = re.sub(value_to_change , 'thevalue' , Long_string ) print modified 

El problema es que en su cadena “y” se convierte a “y”, por lo que en su ejemplo tal como está, no podrá hacer coincidir solo “sin coincidir con las comillas simples”.

Pero tengo entendido que estos datos provienen de un archivo, por lo que suponemos que tiene su_archivo.txt que contiene

 some 'long' string \' and \" some 'escaped' strings 

puede reemplazar \ ‘y \ “con el siguiente código:

 import re from_file = open("your_file.txt", "r").read() print(re.sub("\\\\(\"|')", "thevalue", from_file)) 

Tenga en cuenta las cuatro barras. Dado que se trata de una cadena, \ se convierte a \ (ya que se trata de un carácter de escape). Luego, en la expresión regular, los restantes se vuelven a convertir en \, ya que este también es un carácter de escape de experssion regular. El resultado coincidirá con una barra y una de las comillas “y”.

Tenga en cuenta que todas estas cadenas son exactamente las mismas:

 Long_string = '''some long string \' and \" some escaped strings''' Long_string = '''some long string ' and " some escaped strings''' Long_string = 'some long string \' and \" some escaped strings' Long_string = "some long string \' and \" some escaped strings" Long_string = 'some long string \' and " some escaped strings' Long_string = "some long string ' and \" some escaped strings" 

No hay ningún carácter de barra invertida en ninguno de ellos. Por lo tanto, la expresión regular que está buscando no necesita coincidir con una barra invertida y una cita, solo una cita:

 modified = re.sub("['\"]", 'thevalue', Long_string) 

Por cierto: tampoco es necesario que compile la expresión regular antes de usarla, re.sub aceptará una expresión regular de cadena así como una comstackción.

Intento esto para imprimir una sola barra invertida (Python 3):

 single_backslash_str = r'\ '[0] print('single_backslash_str') #output: \ print('repr(single_backslash_str)') #output: '\\' 

Espero que esto ayude!