2013-08-05 4 views
1

Je ne peux pas croire qu'il est si difficile de traiter une variable comme chaîne brut! J'ai cherché et trouvé des questions semblables, mais aucune réponse appropriée.Python traiter variable comme chaîne littérale/brute

J'ai une variable avec le nom de domaine stocké dans, par exemple. 'domaine \ utilisateur', j'ai besoin d'obtenir le nom d'utilisateur seulement en utilisant re. Le problème est Python me donne des valeurs hexadécimales pour les combinaisons de caractères spéciaux, par exemple quand j'ai \b dans la chaîne.

J'ai juste besoin d'obtenir la chaîne littérale de la variable, et rien d'autre.

author = list[0] // list[0] contains 'domain\blah' 
author = re.sub('.*\\\\(.+)$', r'\1', author) 

Je pense blah, obtenir 'domain\x08lah'!

L'enregistrement de la chaîne comme chaîne brute au début n'est pas une option, car j'obtiens la chaîne d'autres opérations regex.

Des idées?

EDIT:

je me suis trompé en supposant la variable avait une barre oblique unique En effet, lors de l'obtention de la variable d'une autre opération, l'backclash avait déjà été échappé.. Donc, je faisais un problème pour moi-même en essayant de créer un scénario de test.

+1

Comment 'list [0]' a-t-il été défini en premier lieu? Vous avez défini une chaîne régulière quelque part et n'avez pas échappé à la barre oblique inverse. –

+0

Très bonne question – repzero

Répondre

2

Un littéral de chaîne brut est uniquement utilisé pour créer des valeurs de chaîne, en évitant (la plupart) les codes d'échappement de chaîne qu'un littéral de chaîne normal utiliserait.

Votre chaîne a démarré avec le caractère \x08; il ne contenait jamais de barre oblique inverse et un caractère b. Si vous avez défini la valeur contenue dans list[0] avec un littéral de chaîne, vous avez oublié d'échapper la barre oblique inverse. Si les données proviennent d'ailleurs, vous êtes à la recherche d'une valeur d'octet hexadécimal brut de 08:

>>> list_0 = 'domain\x08lah' 
>>> list_0[6] 
'\x08' 
>>> len(list_0[6]) 
1 
>>> ord(list_0[6]) 
8 

Si cet octet était censé être deux personnages au lieu, vous pouvez réparer les données avec remplacement de chaîne:

>>> list_0.replace('\b', '\\b') 
'domain\\blah' 
+0

merci pour cela. J'ai ajouté une modification à ma question – mavili

+0

votre réponse * m'a * aidé à comprendre les choses, mais pour être tout à fait correct, ce n'était pas la réponse. Et ce n'est pas votre faute, c'est le mien comme je l'ai et une modification à ma question. Mais je l'ai déjà voté; – mavili

Questions connexes