Tecnicamente, qualquer número ímpar de barras invertidas, conforme descrito na documentação .
>>> 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 o analisador pode apenas tratar barras invertidas em cadeias brutas como caracteres regulares (não é isso que são as cadeias brutas?), Mas provavelmente estou perdendo algo óbvio.
Respostas:
O motivo é explicado na parte dessa seção que destaquei em negrito:
Portanto, as strings brutas não são 100% brutas, ainda há algum processamento rudimentar de barra invertida.
fonte
r"foo\bar\baz" "\\"
(quebra automática de parênteses se ambíguo) criará um único literal no momento da compilação, a primeira parte bruta e apenas o último pedacinho não bruto, para permitir a barra invertida à direita.Todo o equívoco sobre as strings brutas do python é que a maioria das pessoas pensa que a barra invertida (dentro de uma string bruta) é apenas um caractere regular como todas as outras. Não é. A chave para entender é a sequência de tutoriais deste python:
Portanto, qualquer caractere após uma barra invertida faz parte da cadeia bruta. Depois que o analisador entra em uma sequência bruta (não Unicode) e encontra uma barra invertida, ele sabe que existem 2 caracteres (uma barra invertida e um caractere a seguir).
Deste jeito:
e:
O último caso mostra que, de acordo com a documentação, agora um analisador não consegue encontrar a cotação de fechamento, pois a última cotação que você vê acima faz parte da string, ou seja, a barra invertida não pode ser a última aqui, pois 'devorará' o caracter de fechamento da string.
fonte
É assim que é! Eu vejo isso como um desses pequenos defeitos em python!
Eu não acho que haja uma boa razão para isso, mas definitivamente não está analisando; é realmente fácil analisar cadeias brutas com \ como último caractere.
O problema é que, se você permitir que \ seja o último caractere de uma sequência bruta, não poderá colocar "dentro de uma sequência bruta. Parece que o python foi com a permissão" em vez de permitir \ como o último caractere.
No entanto, isso não deve causar nenhum problema.
Se você está preocupado em não conseguir escrever facilmente os caminhos das pastas do Windows, como
c:\mypath\
não se preocupe, pois pode representá-los comor"C:\mypath"
e, se precisar acrescentar um nome de subdiretório, não faça isso com concatenação de cadeias, por de qualquer maneira, não é o caminho certo! usaros.path.join
fonte
Para terminar uma string não processada com uma barra, sugiro que você use este truque:
fonte
Outro truque é usar o chr (92) enquanto ele avalia "\".
Recentemente, tive que limpar uma série de barras invertidas e o seguinte foi o seguinte:
Percebo que isso não cuida do "porquê", mas o segmento atrai muitas pessoas que procuram uma solução para um problema imediato.
fonte
"\\"
(string não-raw com barra invertida)Como \ "é permitido dentro da cadeia bruta. Então não pode ser usado para identificar o final da cadeia literal.
Por que não parar de analisar a string literal quando você encontra o primeiro "?
Se fosse esse o caso, \ "não seria permitido dentro da string literal. Mas é.
fonte
\"
qualquer lugar dentro de uma cadeia bruta de aspas duplas, OU \ no final da cadeia bruta de aspas duplas. As estatísticas de uso devem favorecer a sequência de dois caracteres em qualquer lugar vs. a sequência de um caractere no final.A razão pela qual a
r'\'
sintaxe está incorreta é que, embora a expressão da string seja bruta, as aspas usadas (simples ou duplas) sempre precisam ser escapadas, pois, caso contrário, elas marcariam o final da cotação. Portanto, se você deseja expressar uma única citação dentro de uma cadeia de caracteres entre aspas simples, não há outra maneira senão usar\'
. O mesmo se aplica a aspas duplas.Mas você pode usar:
fonte
Outro usuário que excluiu sua resposta (não tem certeza se gostaria de receber créditos) sugeriu que os designers da linguagem Python possam simplificar o design do analisador usando as mesmas regras de análise e expandindo os caracteres de escape para a forma bruta como uma reflexão tardia (se o literal foi marcado como bruto).
Eu pensei que era uma ideia interessante e a incluo como wiki da comunidade para a posteridade.
fonte
fonte
Vindo de C, ficou bem claro para mim que um único \ funciona como caractere de escape, permitindo que você coloque caracteres especiais, como novas linhas, tabulações e aspas, em strings.
Isso de fato desaprova \ como último caractere, pois escapará do "e fará o analisador sufocar. Mas, como apontado anteriormente, \ é legal.
fonte
algumas dicas :
1) se você precisar manipular barra invertida para o caminho, o módulo python padrão os.path é seu amigo. por exemplo :
2) se você deseja criar strings com barra invertida, mas sem barra invertida no final da sua string, a string não processada é sua amiga (use o prefixo 'r' antes da string literal). por exemplo :
3) se você precisar prefixar uma string em uma variável X com uma barra invertida, poderá fazer o seguinte:
4) se você precisar criar uma string com uma barra invertida no final, combine as dicas 2 e 3:
agora lilypond_statement contém
"\DisplayLilyMusic \upper"
viva o python! :)
n3on
fonte
os.path.normpath
irá remover a barra invertida tailing ... Então, como eu deveria concat o nome do arquivo para o caminho ...Encontrei esse problema e encontrei uma solução parcial que é boa para alguns casos. Apesar de o python não conseguir finalizar uma sequência com uma única barra invertida, ela pode ser serializada e salva em um arquivo de texto com uma única barra invertida no final. Portanto, se o que você precisa é salvar um texto com uma única barra invertida no seu computador, é possível:
BTW, ele não está funcionando com o json se você o despejar usando a biblioteca json do python.
Por fim, trabalho com o Spyder e notei que se eu abrir a variável no editor de texto do spider clicando duas vezes em seu nome no explorador de variáveis, ele será apresentado com uma única barra invertida e poderá ser copiado para a área de transferência dessa maneira (não é muito útil para a maioria das necessidades, mas talvez para algumas ..).
fonte