Comment inclure un devis dans une chaîne Python brute

89

Considérer:

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

Alors, comment obtenir le devis, mais pas la barre oblique?

Et s'il vous plaît ne suggérez pas r'what"ever', car alors la question devient simplement comment inclure les deux types de citations?

en relation

mpen
la source
Dans le cas d'utilisation motivant des chaînes brutes (expressions rationnelles et autres cas où quelque chose d'autre que Python interprète les barres obliques inverses), la barre oblique inversée convient, car elle sera traitée par le moteur d'expression régulière / quel que soit le moteur. Cela ne s'applique pas à tous les cas où vous voudrez peut-être utiliser des chaînes brutes, mais assurez-vous de déterminer si cela s'applique à votre cas d'utilisation avant d'essayer de supprimer les barres obliques inverses.
user2357112 prend en charge Monica

Réponses:

146

Si vous souhaitez utiliser des guillemets doubles dans les chaînes mais pas des guillemets simples, vous pouvez simplement utiliser des guillemets simples comme délimiteur à la place:

r'what"ever'

Si vous avez besoin des deux types de guillemets dans votre chaîne, utilisez une chaîne entre guillemets triples:

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

Si vous souhaitez inclure les deux types de chaînes entre guillemets triples dans votre chaîne (un cas extrêmement improbable), vous ne pouvez pas le faire, et vous devrez utiliser des chaînes non brutes avec des échappements.

Adam Rosenfield
la source
1
Excellent. Il m'a fallu une seconde pour réaliser que je pouvais aussi créer des chaînes entre guillemets triples.
mpen
3
J'aime aussi le dernier paragraphe ... c'est exactement ce que j'essayais de comprendre. Les limites des différents styles de citation. Je compare Python r"raw string"et C # @"@-quoted string"et"""triple quotes"""
mpen
2
Python newb ici, un peu confus, n'est-ce pas r'what"ever"une erreur d'analyse? Voulez-vous dire r'what"ever'?
nmr
1
Quel est le problème avec les développeurs Python? Pourquoi n'ont-ils pas simplement implémenté un système d'échappement comme le font toutes les autres langues?
Jamby
6
@Jamby Ils ont un système d'échappement, il suffit de l'utiliser avec une chaîne non brute (des chaînes sans le r devant eux), et cela fonctionne comme à peu près tous les autres langages .
Coburn
10

Python a plus d'un moyen de créer des chaînes. La syntaxe de chaîne suivante vous permet d'utiliser des guillemets doubles:

'''what"ever'''
Karl
la source
Vous avez manqué la partie brute de la question.
mpen
10

Si vous avez besoin de n'importe quel type de guillemet (simple, double et triple pour les deux), vous pouvez "combiner" (0) les chaînes:

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

Vous pouvez également «combiner» (0) des chaînes brutes avec des chaînes non brutes:

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

(0): En fait, l'analyseur Python joint les chaînes, et il ne crée pas plusieurs chaînes. Si vous ajoutez l'opérateur «+», plusieurs chaînes sont créées et combinées.

Bakuriu
la source
5

Peu importe, la réponse est des chaînes brutes entre guillemets triples:

r"""what"ever"""
mpen
la source
3

Depuis que je suis tombé sur cette réponse, et cela m'a beaucoup aidé, mais j'ai trouvé un problème syntaxique mineur, j'ai senti que je devais éviter les frustrations éventuelles des autres. La chaîne entre guillemets triples fonctionne pour ce scénario comme décrit, mais notez que si le "que vous voulez dans la chaîne se produit à la fin de la chaîne elle-même:

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

Vous rencontrerez une erreur lors de l'exécution car le "" "" (4) guillemets d'affilée confond le lecteur de chaîne, car il pense qu'il a déjà atteint la fin de la chaîne et trouve ensuite un "aléatoire". Vous pouvez valider cela en insérant un espace dans les 4 guillemets comme ceci: "" "" et il n'aura pas l'erreur.

Dans ce cas particulier, vous devrez soit utiliser:

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

ou utilisez la méthode décrite ci-dessus pour créer plusieurs chaînes avec des "et" mixtes, puis les concaténer après coup.

charrold303
la source
1

Juste pour inclure de nouvelles fonctionnalités compatibles avec Python f String:

var_a = 10

f"""This is my quoted variable: "{var_a}". """
illusionx
la source
Les f-strings supportent cependant l'échappement, n'est-ce pas? Donc vous pouvez le faire f"foo\"bar".
mpen
-3

Utilisation:

dqote='"'
sqote="'"

Utilisez l'opérateur «+» dqoteet les squotevariables et pour obtenir ce dont vous avez besoin.

Si je veux sed -e s/",u'"/",'"/g -e s/^"u'"/"'"/, vous pouvez essayer ce qui suit:

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