Que faire exactement « u » et « r » drapeaux chaîne font, et quelles sont les chaînes littérales premières?

StackOverflow https://stackoverflow.com/questions/2081640

Question

En demandant cette question , je réalise que je ne savais pas grand-chose sur les chaînes brutes. Pour quelqu'un qui prétend être un entraîneur Django, ce suce.

Je sais ce que l'encodage est, et je sais ce que u'' seul fait que je reçois ce qui est Unicode.

  • Mais qu'est-ce r'' exactement? Quel genre de chaîne Permet-il?

  • Et surtout, ce que le diable fait ur'' faire?

  • Enfin, est-il un moyen fiable pour revenir en arrière à partir d'une chaîne Unicode à une simple chaîne brute?

  • Ah, et en passant, si votre système et votre éditeur de texte charset sont en UTF-8, ne u'' faire quoi que ce soit?

Était-ce utile?

La solution

Il n'y a pas vraiment de "brut string "; il y a des littéraux premières cordes , qui sont exactement les chaînes littérales marquées par un 'r' avant la citation d'ouverture.

Une « chaîne brute littérale » est une syntaxe légèrement différente pour une chaîne littérale, dans lequel une barre oblique inverse, \, est considéré comme signifiant « juste une barre oblique inverse » (sauf quand il vient juste avant une citation qui autrement fin le littéral ) - pas de « séquences d'échappement » pour représenter les nouvelles lignes, des onglets, backspaces form-flux, et ainsi de suite. Dans des chaînes normales, chaque barre oblique inverse doit être doublé pour éviter d'être considéré comme le début d'une séquence d'échappement.

Cette variante de syntaxe existe surtout parce que la syntaxe des modèles d'expression régulière est lourd avec des barres obliques inverses (mais jamais à la fin, de sorte que le « sauf » clause ci-dessus pas d'importance) et il semble un peu mieux quand vous évitez de doubler chaque d'entre eux - c'est tout. Il a également gagné une certaine popularité pour exprimer des chemins de fichiers natifs de Windows (avec antislashs au lieu de barres obliques réguliers comme sur d'autres plates-formes), mais qui est très rarement nécessaire (puisque les barres obliques normales travaillent surtout bien sur Windows aussi) et imparfait (en raison de la clause « sauf » ci-dessus).

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 (donc par exemple r'...', r'''...''', r"...", r"""...""" sont toutes les chaînes d'octets, etc.).

Je ne sais pas ce que vous entendez par « aller retour » - il n'y a pas de retour en soi et les directions avant, parce qu'il n'y a pas de chaîne brute type , il est juste une syntaxe alternative à car ils peuvent être exprimer objets chaîne tout à fait normal, octet ou Unicode.

Et oui, en Python 2. *, u'...' est bien sûr toujours distinct de tout '...' - le premier est une chaîne unicode, celle-ci est une chaîne d'octets. Quel encodage littéral peut être exprimé en est une question complètement orthogonal.

par exemple, considérer (Python 2.6):.

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

L'objet Unicode bien sûr prend plus d'espace mémoire (très petite différence pour une chaîne très courte, de toute évidence, -).

Autres conseils

Il existe deux types de chaîne en python: le type de str traditionnel et le nouveau type de unicode. Si vous tapez une chaîne littérale sans u devant vous l'ancien type de str qui stocke les caractères 8 bits, et avec le u devant vous obtenez le nouveau type de unicode qui peut stocker tous les caractères Unicode.

Le r ne change pas le type du tout, il change juste comment interpréter la chaîne littérale. Sans le r, anti-slash sont traités comme des caractères d'échappement. Avec le r, anti-slash sont traités comme littéral. De toute façon, le type est le même.

ur est bien sûr une chaîne Unicode où sont antislashs antislashs littérale, ne fait pas partie des codes d'échappement.

Vous pouvez essayer de convertir une chaîne Unicode à une ancienne chaîne en utilisant la fonction str(), mais s'il y a des caractères unicode qui ne peuvent pas être représentés dans la vieille chaîne, vous obtiendrez une exception. Vous pouvez les remplacer par des points d'interrogation d'abord si vous le souhaitez, mais bien sûr, cela causerait ces caractères illisibles. Il est recommandé de ne pas utiliser le type de str si vous voulez gérer correctement les caractères unicode.

'chaîne brute' signifie qu'il est stocké tel qu'il apparaît. Par exemple, '\' est juste un backslash au lieu d'un échapper .

Un préfixe "u" désigne la valeur est de type unicode plutôt que str.

littéraux chaîne brute, avec un préfixe « r », échapper à toutes les séquences d'échappement en leur sein, alors len(r"\n") est 2. Parce qu'ils ESCAPE séquences, vous ne pouvez pas mettre fin à une chaîne littérale avec une seule barre oblique inverse: ce n'est pas une séquence d'échappement valide ( par exemple r"\").

« Raw » ne fait pas partie du type, il est simplement une façon de représenter la valeur. Par exemple, "\\n" et r"\n" sont des valeurs identiques, tout comme 32, 0x20 et 0b100000 sont identiques.

Vous pouvez avoir littéraux chaîne brute unicode:

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

Le fichier codage de source détermine simplement la façon d'interpréter le fichier source, il ne modifie pas les expressions ou les types autrement. Cependant, il est recommandé d'éviter le code où un codage autre que ASCII changerait la ce qui signifie:

  

Les fichiers utilisant ASCII (ou UTF-8, pour Python 3.0) ne devraient pas avoir un cookie de codage. Latin-1 (ou UTF-8) ne doit être utilisé lorsqu'un commentaire ou docstring doit mentionner le nom d'un auteur qui exige Latin-1; sinon, en utilisant \ x, \ u ou \ U échappe est le moyen préféré d'inclure des données non-ASCII dans les chaînes littérales.

Laissez-moi vous expliquer simplement: En python 2, vous pouvez stocker la chaîne dans 2 types différents.

Le premier est ASCII qui est str type dans python, il utilise 1 octet de la mémoire. (256 caractères, stockera la plupart du temps alphabets anglais et des symboles simples)

Le deuxième type est UNICODE qui est unicode type dans python, il utilise 2 octets de mémoire. (65536 caractères, donc ce sont tous les caractères de toutes les langues de la terre)

Par défaut, Python préférera str type, mais si vous voulez stocker la chaîne dans unicode type que vous pouvez mettre u devant la texte comme u'text ou vous pouvez le faire en appelant unicode ( 'text')

u est juste un moyen à court d'appeler une fonction pour lancer str unicode . Ca y est!

r une partie, vous mettez en face du texte pour indiquer à l'ordinateur que le texte est un texte brut, backslash ne doit pas être un caractère échapper. r \ n ne crée pas un caractère de nouvelle ligne. Il est juste le texte brut contenant 2 caractères.

Si vous voulez convertir str unicode et aussi mettre du texte brut là-bas, utilisez ur parce que ru soulèvera une erreur.

maintenant, la partie importante:

Vous ne pouvez pas stocker une barre oblique inverse en utilisant r , c'est la seule exception. Donc, ce code produira erreur: r '\'

Pour enregistrer une barre oblique inverse (une seule), vous devez utiliser \\ '

Si vous souhaitez stocker plus de 1 caractères que vous pouvez toujours utiliser r comme r '\\' produira 2 antislashs comme prévu.

Je ne sais pas la raison pour laquelle r ne fonctionne pas avec un stockage anti-slash, mais la raison n'est pas décrite par personne pour le moment. J'espère que c'est un bogue.

Peut-être cela est évident, peut-être pas, mais vous pouvez faire la chaîne '\' en appelant x = chr (92)

x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y   # True
x is y # False

littéraux de chaîne Unicode

littéraux de chaîne Unicode (chaînes littérales préfixés par u) sont ne sont plus utilisés en Python 3. Ils sont toujours valables mais juste pour des raisons de compatibilité avec Python 2.

littéraux chaîne brute

Si vous voulez créer une chaîne littérale composée de seulement caractères facilement typables comme des lettres anglaises ou des chiffres, vous pouvez simplement les taper: 'hello world'. Mais si vous voulez inclure aussi des personnages plus exotiques, vous devrez utiliser une solution de contournement. L'une des solutions de contournement sont Séquences d'échappement . De cette façon, vous pouvez par exemple représenter une nouvelle ligne dans votre chaîne en ajoutant simplement deux caractères facilement typables \n à votre chaîne littérale. Donc, lorsque vous imprimez la chaîne de 'hello\nworld', les mots seront imprimés sur des lignes distinctes. C'est très pratique!

Par contre, il y a des situations où vous voulez créer une chaîne de caractères qui contient des séquences d'échappement, mais vous ne voulez pas qu'ils soient interprétés par Python. Vous les voulez être brut . Regardez ces exemples:

'New updates are ready in c:\windows\updates\new'
'In this lesson we will learn what the \n escape sequence does.'

Dans de telles situations, vous pouvez simplement préfixe la chaîne littérale avec le caractère r comme ceci: r'hello\nworld' et aucune séquence d'échappement sera interprété par Python. La chaîne sera imprimé exactement comme vous l'avez créé.

littéraux chaîne brute ne sont pas complètement "brut"?

Beaucoup de gens attendent les chaînes littérales premières à être cru dans un sens que « quoi que ce soit placé entre les guillemets est ignorée par Python » . Ce n'est pas vrai. Python reconnaît encore toutes les séquences d'échappement, il ne vient pas les interpréter - il les laisse inchangés à la place. Cela signifie que littéraux chaîne brute doivent encore être littéraux de chaîne valides .

De la définition lexicale de une chaîne de caractères:

string     ::=  "'" stringitem* "'"
stringitem ::=  stringchar | escapeseq
stringchar ::=  <any source character except "\" or newline or the quote>
escapeseq  ::=  "\" <any source character>

Il est clair que les chaînes littérales (brutes ou non) contenant un guillemet nu: 'hello'world' ou se terminant par une barre oblique inverse. 'hello world\' ne sont pas valides

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top