J'ai besoin d'échapper un caractère &
(Esperluette) dans une chaîne. Le problème est à chaque fois que je string = string.replace ('&', '\&')
le résultat est '\\&'
. Une barre oblique inverse supplémentaire est ajoutée pour échapper à la barre oblique inverse d'origine. Comment supprimer cette barre oblique inverse supplémentaire?
Le résultat '\\&'
s'affiche uniquement - en fait, la chaîne est \&
:
>>> str = '&'
>>> new_str = str.replace('&', '\&')
>>> new_str
'\\&'
>>> print new_str
\&
Essayez-le dans un Shell.
La barre oblique inverse supplémentaire n'est pas réellement ajoutée; il est simplement ajouté par la fonction repr()
pour indiquer qu'il s'agit d'une barre oblique inverse littérale. L'interprète Python utilise la fonction repr()
(qui appelle __repr__()
sur l'objet) lorsque le résultat d'une expression doit être imprimé:
>>> '\\'
'\\'
>>> print '\\'
\
>>> print '\\'.__repr__()
'\\'
Python traite \
Dans une chaîne littérale d'une manière spéciale.
C'est ainsi que vous pouvez taper '\n'
Pour signifier nouvelle ligne ou '\t'
Pour signifier onglet
Étant donné que '\&'
Ne signifie rien de spécial pour Python, au lieu de provoquer une erreur, l'analyseur lexical Python ajoute le supplément \
] pour vous.
Vraiment, il vaut mieux utiliser \\&
Ou r'\&'
Au lieu de '\&'
r
signifie ici chaîne brute et signifie que \
N'est pas traité spécialement sauf s'il est juste avant la citation caractère au début de la chaîne.
Dans la console interactive, Python utilise repr
pour afficher le résultat, c'est pourquoi vous voyez le double '\'. Si vous print
votre chaîne ou utilisez len(string)
vous verrez que ce ne sont vraiment que les 2 caractères
Quelques exemples
>>> 'Here\'s a backslash: \\'
"Here's a backslash: \\"
>>> print 'Here\'s a backslash: \\'
Here's a backslash: \
>>> 'Here\'s a backslash: \\. Here\'s a double quote: ".'
'Here\'s a backslash: \\. Here\'s a double quote: ".'
>>> print 'Here\'s a backslash: \\. Here\'s a double quote: ".'
Here's a backslash: \. Here's a double quote ".
Pour clarifier le point que Peter fait valoir dans son commentaire, voir ce lien
Contrairement à la norme C, toutes les séquences d'échappement non reconnues sont laissées inchangées dans la chaîne, c'est-à-dire que la barre oblique inverse est laissée dans la chaîne. (Ce comportement est utile lors du débogage: si une séquence d'échappement est mal typée, la sortie résultante est plus facilement reconnue comme rompue.) Il est également important de noter que les séquences d'échappement marquées comme "(Unicode uniquement)" dans le tableau ci-dessus tombent dans la catégorie des échappements non reconnus pour les littéraux de chaîne non Unicode.
>>> '\\&' == '\&'
True
>>> len('\\&')
2
>>> print('\\&')
\&
Ou en d'autres termes: '\\&'
ne contient qu'une barre oblique inverse. Il est juste échappé dans la sortie de python Shell pour plus de clarté.
l'impression d'une liste peut également causer ce problème (je suis nouveau en python, donc ça m'a un peu dérouté aussi):
>>>myList = ['\\']
>>>print myList
['\\']
>>>print ''.join(myList)
\
de même:
>>>myList = ['\&']
>>>print myList
['\\&']
>>>print ''.join(myList)
\&
Il n'y a pas de barre oblique inverse supplémentaire, il est simplement formaté de cette façon dans l'environnement interactif. Essayer:
print string
Ensuite, vous pouvez voir qu'il n'y a vraiment pas de barre oblique inverse supplémentaire.