Il n'y a pas vraiment de " chaîne brute "; il existe des littéraux de chaîne bruts , qui sont exactement les littéraux de chaîne marqués d'un 'r'
avant la citation d'ouverture.
Un "littéral de chaîne brut" est une syntaxe légèrement différente pour un littéral de chaîne, dans laquelle une barre oblique inverse, \
est considérée comme signifiant "juste une barre oblique inverse" (sauf lorsqu'elle vient juste avant une citation qui autrement mettrait fin au littéral) - non "séquences d'échappement" pour représenter les nouvelles lignes, les tabulations, les espaces arrière, les flux de formulaires, etc. Dans les littéraux de chaîne normaux, chaque barre oblique inverse doit être doublée pour éviter d'être considérée comme le début d'une séquence d'échappement.
Cette variante de syntaxe existe principalement parce que la syntaxe des modèles d'expression régulière est lourde de barres obliques inverses (mais jamais à la fin, donc la clause "except" ci-dessus n'a pas d'importance) et elle semble un peu meilleure lorsque vous évitez de doubler chacun d'eux - - c'est tout. Il a également gagné en popularité pour exprimer les chemins de fichiers natifs de Windows (avec des barres obliques inverses au lieu de barres obliques normales comme sur d'autres plates-formes), mais cela est très rarement nécessaire (car les barres obliques normales fonctionnent généralement bien sur Windows aussi) et imparfaites (en raison de la clause "except") au dessus de).
r'...'
est une chaîne d'octets (en Python 2. *), ur'...'
est une chaîne Unicode (encore une fois, en Python 2. *), et l' un des trois autres types de produit citant aussi exactement les mêmes types de cordes (ainsi , par exemple r'...'
, r'''...'''
, r"..."
, r"""..."""
sont toutes des chaînes d'octets, etc.).
Je ne sais pas ce que vous entendez par " revenir en arrière " - il n'y a pas de sens intrinsèque en arrière et en avant, car il n'y a pas de type de chaîne brute , c'est juste une syntaxe alternative pour exprimer des objets de chaîne parfaitement normaux, octets ou unicode tels qu'ils peuvent être.
Et oui, en Python 2. *, u'...'
est bien sûr toujours distinct de juste '...'
- le premier est une chaîne unicode, le dernier est une chaîne d'octets. Dans quel codage le littéral pourrait être exprimé est un problème complètement orthogonal.
Par exemple, considérez (Python 2.6):
>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34
L'objet Unicode prend bien sûr plus d'espace mémoire (très petite différence pour une chaîne très courte, évidemment ;-).
u
etr
ne sont pas commutatifs:ur'str'
fonctionne, ne fonctionneru'str'
pas. (au moins dans ipython 2.7.2 sur win7)r
chaînes et j'ai remarqué que si\
c'est le dernier caractère, il ne sera pas pris comme un littéral mais échappera à la place à la citation de fermeture, ce qui provoqueraSyntaxError: EOL while scanning string literal
. Il\\
faut donc toujours utiliser l'instance finale de\
dans toutes les chaînes se terminant par une barre oblique inverse.sys.getsizeof('cioa') == sys.getsizeof(r'cioa') == sys.getsizeof(u'cioa')
(Ubuntu 16.04 avec UTF8 lang). De même,type('cioa') == type(r'cioa') == type(u'cioa')
. MAIS, l'interpolation de chaîne brute fait une différence, alorssys.getsizeof('\ncioa') == sys.getsizeof(u'\ncioa') != sys.getsizeof(r'\ncioa')
Il existe deux types de chaîne en python: le
str
type traditionnel et leunicode
type plus récent . Si vous tapez un littéral de chaîne sans leu
devant vous obtenez l'ancienstr
type qui stocke les caractères 8 bits, et avec leu
devant vous obtenez le plus récentunicode
type qui peut stocker n'importe quel caractère Unicode.Le
r
ne change pas du tout le type, il change juste la façon dont le littéral de chaîne est interprété. Sans ler
, les barres obliques inverses sont traitées comme des caractères d'échappement. Avec ler
, les barres obliques inverses sont traitées comme littérales. De toute façon, le type est le même.ur
est bien sûr une chaîne Unicode où les barres obliques inverses sont des barres obliques inverses littérales, qui ne font pas partie des codes d'échappement.Vous pouvez essayer de convertir une chaîne Unicode en une ancienne chaîne à l'aide de la
str()
fonction, mais s'il existe des caractères Unicode qui ne peuvent pas être représentés dans l'ancienne chaîne, vous obtiendrez une exception. Vous pouvez d'abord les remplacer par des points d'interrogation si vous le souhaitez, mais bien sûr, cela rendrait ces caractères illisibles. Il n'est pas recommandé d'utiliser lestr
type si vous souhaitez gérer correctement les caractères unicode.la source
r"\"
s'agit d'une erreur de syntaxe.«chaîne brute» signifie qu'elle est stockée telle qu'elle apparaît. Par exemple,
'\'
c'est juste une barre oblique inverse au lieu d'un échappement .la source
Un préfixe "u" indique que la valeur a un type
unicode
plutôt questr
.Les littéraux de chaîne bruts, avec un préfixe "r", échappent à toutes les séquences d'échappement en leur sein, tout
len(r"\n")
comme 2. Comme ils échappent aux séquences d'échappement, vous ne pouvez pas terminer un littéral de chaîne avec une seule barre oblique inverse: ce n'est pas une séquence d'échappement valide (par exempler"\"
)."Raw" ne fait pas partie du type, c'est simplement une façon de représenter la valeur. Par exemple,
"\\n"
etr"\n"
sont des valeurs identiques, tout comme32
,0x20
et0b100000
sont identiques.Vous pouvez avoir des littéraux de chaîne brute unicode:
L'encodage du fichier source détermine simplement comment interpréter le fichier source, il n'affecte pas les expressions ou les types autrement. Cependant, il est recommandé d'éviter le code où un encodage autre que ASCII changerait la signification:
la source
Permettez-moi de l'expliquer simplement: en python 2, vous pouvez stocker une chaîne dans 2 types différents.
Le premier est ASCII qui est de type str en python, il utilise 1 octet de mémoire. (256 caractères, stockera principalement des alphabets anglais et des symboles simples)
Le 2ème type est UNICODE qui est de type unicode en python. Unicode stocke tous les types de langues.
Par défaut, python préférera le type str mais si vous voulez stocker une chaîne en type unicode vous pouvez mettre u devant le texte comme u'text ' ou vous pouvez le faire en appelant unicode (' text ')
Donc, u est juste un moyen rapide d'appeler une fonction pour convertir str en unicode . C'est ça!
Maintenant, la partie r , vous le placez devant le texte pour dire à l'ordinateur que le texte est du texte brut, la barre oblique inverse ne doit pas être un caractère d'échappement. r '\ n' ne créera pas de nouveau caractère de ligne. C'est juste du texte brut contenant 2 caractères.
Si vous voulez convertir str en unicode et y mettre également du texte brut, utilisez ur car ru soulèvera une erreur.
MAINTENANT, la partie importante:
Vous ne pouvez pas stocker une barre oblique inverse à l'aide de r , c'est la seule exception. Donc, ce code produira une erreur: r '\'
Pour stocker une barre oblique inverse (une seule), vous devez utiliser '\\'
Si vous souhaitez stocker plus de 1 caractères, vous pouvez toujours utiliser r comme r '\\' produira 2 barres obliques inverses comme vous vous y attendiez.
Je ne connais pas la raison pour laquelle r ne fonctionne pas avec un seul stockage de barre oblique inverse, mais la raison n'est encore décrite par personne. J'espère que c'est un bug.
la source
r'\'
est illégal, mais que vous ne pouvez même pas en mettre un'\'
à la queue d'une corde. Tout commer'xxxxxx\'
une chaîne illégale.str
. En savoir plus pour une meilleure compréhension ici: medium.com/better-programming/…C'est peut-être évident, peut-être pas, mais vous pouvez créer la chaîne '\' en appelant x = chr (92)
la source
x is y
évalue à True en python3?x is y
arrive d'évaluer àTrue
cause d'un internat. Utilisez plutôtx == y
(si vous ne vérifiez pas si x et y sont exactement le même objet stocké à une seule position de mémoire, c'est-à-dire).Littéraux de chaîne Unicode
Les littéraux de chaîne Unicode (littéraux de chaîne précédés de
u
) ne sont plus utilisés dans Python 3. Ils sont toujours valides mais uniquement à des fins de compatibilité avec Python 2.Littéraux de chaîne bruts
Si vous voulez créer une chaîne littérale composée de seulement facilement des caractères typables comme des lettres anglaises ou des chiffres, vous pouvez simplement les taper:
'hello world'
. Mais si vous souhaitez inclure également des personnages plus exotiques, vous devrez utiliser une solution de contournement. L'une des solutions est les séquences d'échappement . De cette façon, vous pouvez par exemple représenter une nouvelle ligne dans votre chaîne simplement en ajoutant deux caractères facilement saisissables\n
à votre littéral de chaîne. Ainsi, lorsque vous imprimez la'hello\nworld'
chaîne, les mots seront imprimés sur des lignes distinctes. C'est très pratique!D'un autre côté, il existe certaines situations où vous souhaitez créer un littéral de chaîne contenant des séquences d'échappement mais que vous ne souhaitez pas qu'elles soient interprétées par Python. Vous voulez qu'ils soient bruts . Regardez ces exemples:
Dans de telles situations, vous pouvez simplement préfixer le littéral de chaîne avec le
r
caractère comme ceci:r'hello\nworld'
et aucune séquence d'échappement ne sera interprétée par Python. La chaîne sera imprimée exactement comme vous l'avez créée.Les littéraux de chaîne bruts ne sont pas complètement "bruts"?
Beaucoup de gens s'attendent à ce que les littéraux de chaîne bruts soient bruts dans un sens que "tout ce qui est placé entre les guillemets est ignoré par Python" . Ce n'est pas vrai. Python reconnaît toujours toutes les séquences d'échappement, il ne les interprète tout simplement pas - il les laisse inchangées à la place. Cela signifie que les littéraux de chaîne bruts doivent toujours être des littéraux de chaîne valides .
De la définition lexicale d'un littéral de chaîne:
Il est clair que les littéraux de chaîne (bruts ou non) contenant un caractère guillemet nu:
'hello'world'
ou se terminant par une barre oblique inversée:'hello world\'
ne sont pas valides.la source