2011-11-23 4 views
1

Je voudrais supprimer certains caractères d'une chaîne (soit chaîne d'octets ou une chaîne unicode) en utilisant une expression régulière comme ceci:expression régulière et unicode littéraux

pattern = re.compile(ur'\u00AE|\u2122', re.UNICODE)

Si les caractères sont spécifiés comme unicode littéraux l'expression rationnelle résultante ne fonctionne pas correctement sur une chaîne d'octets.

q = 'Canon\xc2\xae EOS 7D' 
pattern.sub('', q) # 'Canon\xc2 EOS 7D' 

Si je convertir l'argument de la substitution à une chaîne de caractères Unicode, cependant, il fonctionne comme prévu ...

pattern.sub('', unicode(q)) # u'Canon EOS 7D' 

Quelqu'un peut-il s'il vous plaît me expliquer pourquoi est-ce le cas?

grâce,

Peter

Répondre

2

Comme une chaîne standard (octet) n'est pas une chaîne Unicode. Python ne sait pas dans quel encodage il se trouve (ou même si c'est Unicode du tout!), Et n'a donc aucun moyen de déterminer si un caractère Unicode particulier correspond à un caractère quelconque. La solution consiste à dire à Python que c'est Unicode, en utilisant la fonction unicode(), comme vous l'avez compris.

+0

Merci pour la clarification - donc le message à emporter est "ne pas mélanger str et chaînes Unicode (sauf si vous êtes néerlandais)"? –

+0

Je pense que si vous êtes Néerlandais, vous changez simplement la langue pour que toutes les chaînes soient Unicode par défaut. :-) – kindall

Questions connexes