Técnicamente, cualquier número impar de barras invertidas, como se describe en la documentación .
>>> r'\'
File "<stdin>", line 1
r'\'
^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
File "<stdin>", line 1
r'\\\'
^
SyntaxError: EOL while scanning string literal
Parece que el analizador podría tratar las barras invertidas en cadenas sin formato como caracteres normales (¿no es eso de lo que se tratan las cadenas sin formato?), Pero probablemente me estoy perdiendo algo obvio.
Respuestas:
La razón se explica en la parte de esa sección que destaqué en negrita:
Por lo tanto, las cadenas sin formato no son 100% sin formato, todavía hay un procesamiento rudimentario de barra invertida.
fuente
r"foo\bar\baz" "\\"
(envolver en parens si es ambiguo) creará un único literal en tiempo de compilación, la primera parte de la cual es sin formato, y solo el último pequeño bit no es sin formato, para permitir la barra invertida final.Todo el concepto erróneo sobre las cadenas en bruto de Python es que la mayoría de la gente piensa que la barra invertida (dentro de una cadena en bruto) es solo un carácter normal como todos los demás. No lo es. La clave para entender es la secuencia tutorial de esta pitón:
Por lo tanto, cualquier carácter que siga una barra diagonal inversa es parte de una cadena sin formato. Una vez que el analizador ingresa una cadena sin procesar (no Unicode) y encuentra una barra invertida, sabe que hay 2 caracteres (una barra invertida y un carácter que le sigue).
De esta manera:
y:
El último caso muestra que, según la documentación, ahora un analizador no puede encontrar la cita de cierre, ya que la última cita que ve arriba es parte de la cadena, es decir, la barra invertida no puede ser la última aquí, ya que 'devorará' la cadena de caracteres de cierre.
fuente
¡Esa es la forma en que está! ¡Lo veo como uno de esos pequeños defectos en Python!
No creo que haya una buena razón para ello, pero definitivamente no está analizando; Es muy fácil analizar cadenas sin procesar con \ como último carácter.
El problema es que si permites que \ sea el último carácter en una cadena sin formato, entonces no podrás poner "dentro de una cadena sin formato. Parece que Python fue con permitir" en lugar de permitir \ como último carácter.
Sin embargo, esto no debería causar ningún problema.
Si le preocupa no poder escribir fácilmente parches de carpetas de Windows, como por ejemplo
c:\mypath\
, no se preocupe, puede representarlos comor"C:\mypath"
y, si necesita agregar un nombre de subdirectorio, no lo haga con concatenación de cadenas, para ¡no es la forma correcta de hacerlo de todos modos! utilizaros.path.join
fuente
Para que pueda terminar una cadena sin procesar con una barra inclinada, le sugiero que pueda usar este truco:
fuente
Otro truco es usar chr (92) ya que se evalúa como "\".
Recientemente tuve que limpiar una cadena de barras invertidas y lo siguiente hizo el truco:
Me doy cuenta de que esto no se ocupa del "por qué", pero el hilo atrae a muchas personas que buscan una solución a un problema inmediato.
fuente
"\\"
(cadena no cruda con barra invertida)Como \ "está permitido dentro de la cadena sin procesar. Entonces no se puede usar para identificar el final de la cadena literal.
¿Por qué no dejar de analizar el literal de cadena cuando te encuentras con el primer "?
Si ese fuera el caso, entonces \ "no estaría permitido dentro del literal de cadena. Pero lo es.
fuente
\"
cualquier lugar dentro de una cadena sin formato entre comillas dobles, O \ al final de la cadena sin formato entre comillas dobles. Las estadísticas de uso deben favorecer la secuencia de dos caracteres en cualquier lugar frente a la secuencia de un carácter al final.La razón por la cual la
r'\'
sintaxis es incorrecta es que, aunque la expresión de cadena es sin formato, las comillas utilizadas (simple o doble) siempre tienen que escapar, ya que de lo contrario marcarían el final de la cita. Entonces, si desea expresar una comilla simple dentro de una cadena entre comillas simples, no hay otra forma que usarla\'
. Lo mismo se aplica para las comillas dobles.Pero podrías usar:
fuente
Otro usuario que desde entonces eliminó su respuesta (no estoy seguro de si desea que se les acredite) sugirió que los diseñadores del lenguaje Python podrían simplificar el diseño del analizador utilizando las mismas reglas de análisis y expandiendo los caracteres escapados a forma cruda como una ocurrencia tardía. (si el literal se marcó como crudo).
Pensé que era una idea interesante y la estoy incluyendo como wiki comunitaria para la posteridad.
fuente
fuente
Viniendo de C, es bastante claro para mí que un solo \ funciona como carácter de escape, lo que le permite poner caracteres especiales como líneas nuevas, pestañas y citas en cadenas.
De hecho, eso no permite \ como último personaje, ya que escapará al "y hará que el analizador se ahogue. Pero como se señaló anteriormente \ es legal.
fuente
algunos consejos :
1) si necesita manipular la barra diagonal inversa para la ruta, el módulo estándar de Python os.path es su amigo. por ejemplo :
2) si desea construir cadenas con barra invertida PERO sin barra invertida al FINAL de su cadena, entonces la cadena sin procesar es su amigo (use el prefijo 'r' antes de su cadena literal). por ejemplo :
3) si necesita anteponer una cadena en una variable X con una barra diagonal inversa, puede hacer esto:
4) si necesita crear una cadena con una barra diagonal inversa al final, combine los consejos 2 y 3:
ahora lilypond_statement contiene
"\DisplayLilyMusic \upper"
¡Viva Python! :)
n3on
fuente
os.path.normpath
eliminará la barra invertida tizón ... Entonces, ¿qué he de concat el nombre del archivo en el camino ...Encontré este problema y encontré una solución parcial que es buena para algunos casos. A pesar de que Python no puede finalizar una cadena con una sola barra diagonal inversa, se puede serializar y guardar en un archivo de texto con una sola barra diagonal inversa al final. Por lo tanto, si lo que necesita es guardar un texto con una barra invertida en su computadora, es posible:
Por cierto, no funciona con json si lo vuelcas usando la biblioteca json de python.
Finalmente, trabajo con Spyder, y noté que si abro la variable en el editor de texto de la araña haciendo doble clic en su nombre en el explorador de variables, se presenta con una barra invertida y se puede copiar al portapapeles de esa manera (no es muy útil para la mayoría de las necesidades, pero quizás para algunos ...).
fuente