Não há realmente nenhuma " string bruta "; existem literais de string brutos , que são exatamente os literais de string marcados com um 'r'
antes da citação de abertura.
Um "literal de cadeia de caracteres brutos" é uma sintaxe ligeiramente diferente para um literal de cadeia de caracteres, na qual uma barra invertida \
é entendida como significando "apenas uma barra invertida" (exceto quando ocorre logo antes de uma citação que de outra forma terminaria o literal) - não "seqüências de escape" para representar novas linhas, guias, backspaces, feeds de formulário e assim por diante. Em literais de sequência normal, cada barra invertida deve ser dobrada para evitar ser tomada como o início de uma sequência de escape.
Essa variante de sintaxe existe principalmente porque a sintaxe dos padrões de expressão regular é pesada com barras invertidas (mas nunca no final, portanto a cláusula "exceto" acima não importa) e fica um pouco melhor quando você evita dobrar cada uma delas - - Isso é tudo. Também ganhou popularidade ao expressar caminhos de arquivos nativos do Windows (com barras invertidas em vez de barras normais, como em outras plataformas), mas isso é muito raramente necessário (já que as barras normais também funcionam bem no Windows também) e imperfeito (devido à cláusula "exceto" acima).
r'...'
é uma seqüência de byte (em Python 2. *), ur'...'
é uma cadeia Unicode (novamente, em Python 2. *), e qualquer um dos outros três tipos de citar também produz exatamente os mesmos tipos de cordas (assim, por exemplo r'...'
, r'''...'''
, r"..."
, r"""..."""
são todas cadeias de bytes e assim por diante).
Não sei ao certo o que você quer dizer com " voltar " - não há instruções intrinsecamente para trás e para frente, porque não há tipo de string bruto , é apenas uma sintaxe alternativa para expressar objetos de string perfeitamente normais, byte ou unicode, como podem ser.
E sim, no Python 2. *, u'...'
é claro que sempre é diferente de apenas '...'
- o primeiro é uma string unicode, o último é uma string de bytes. A codificação do literal pode ser expressa em uma questão completamente ortogonal.
Por exemplo, considere (Python 2.6):
>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34
Obviamente, o objeto Unicode ocupa mais espaço na memória (diferença muito pequena para uma string muito curta, obviamente ;-).