Como incluir uma citação em uma string Python bruta

91

Considerar:

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

Então, como obtemos a citação, mas não a barra?

E, por favor, não sugira r'what"ever', porque então a questão é: como incluímos os dois tipos de citações?

Relacionados

mpen
fonte
No caso de uso motivador para strings brutas (regexes e outros casos onde algo diferente de Python interpreta as barras invertidas), a barra invertida é adequada, porque será processada pelo mecanismo regex / qualquer mecanismo. Isso não se aplica a todos os casos em que você pode querer usar strings brutas, mas certifique-se de pensar se isso se aplica ao seu caso de uso antes de tentar remover as barras invertidas.
user2357112 suporta Monica

Respostas:

148

Se quiser usar aspas duplas em strings, mas não aspas simples, você pode usar aspas simples como delimitador:

r'what"ever'

Se você precisar dos dois tipos de aspas em sua string, use uma string entre aspas triplas:

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

Se você quiser incluir os dois tipos de strings com aspas triplas em sua string (um caso extremamente improvável), você não pode fazer isso e terá que usar strings não brutas com escapes.

Adam Rosenfield
fonte
1
Excelente. Levei um segundo para perceber que eu também poderia tornar crus as cordas entre aspas triplas.
março
3
Eu gosto do último parágrafo também ... isso era exatamente o que eu estava tentando descobrir. As limitações dos diferentes estilos de citação. Estou comparando Python's r"raw string"e C #'s @"@-quoted string"e"""triple quotes"""
mpen
2
Python newb aqui, um pouco confuso, não é r'what"ever"um erro de análise? Você quis dizer r'what"ever'?
NMR
1
O que há de errado com os desenvolvedores Python? Por que eles simplesmente não implementaram um sistema de escape como todas as outras linguagens fazem?
Jamby
6
@Jamby Eles têm um sistema de escape, você apenas o usa com strings não brutas (strings sem o r na frente deles), e funciona como praticamente qualquer outra linguagem .
Coburn
10

Python tem mais de uma maneira de fazer strings. A seguinte sintaxe de string permite que você use aspas duplas:

'''what"ever'''
Karl
fonte
1
Você perdeu a parte crua da pergunta.
maio
10

Se precisar de qualquer tipo de citação (simples, dupla e tripla para ambos), você pode "combinar" (0) as strings:

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

Você também pode "combinar" (0) strings brutas com strings não brutas:

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

(0): Na verdade, o analisador Python une as strings e não cria várias strings. Se você adicionar o operador "+", várias strings serão criadas e combinadas.

Bakuriu
fonte
5

Esqueça, a resposta são strings brutas entre aspas triplas:

r"""what"ever"""
mpen
fonte
3

Como tropecei nessa resposta, e ela me ajudou muito, mas encontrei um pequeno problema sintático, achei que deveria evitar a possível frustração dos outros. A string entre aspas triplas funciona para este cenário conforme descrito, mas observe que se o "que você deseja na string ocorrer no final da própria string:

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

Você encontrará um erro na execução porque as "" "" (4) aspas consecutivas confundem o leitor de string, pois ele pensa que já atingiu o fim da string e encontra um "aleatório". Você pode validar isso inserindo um espaço entre as 4 aspas assim: "" "" e não terá o erro.

Neste caso especial, você precisará usar:

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

ou use o método descrito acima para construir várias strings com "e 'misto e então concatená-las após o fato.

charrold303
fonte
1

Apenas para incluir uma nova funcionalidade compatível com Python f String:

var_a = 10

f"""This is my quoted variable: "{var_a}". """
ilusão
fonte
Strings f suportam escape, não é? Então você pode fazer f"foo\"bar".
março de
-3

Usar:

dqote='"'
sqote="'"

Use o operador '+' dqotee as squotevariáveis ​​para obter o que você precisa.

Se eu quiser sed -e s/",u'"/",'"/g -e s/^"u'"/"'"/, você pode tentar o seguinte:

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