web-dev-qa-db-fra.com

Python Remplacez \\ par \

Donc, je n'arrive pas à comprendre cela ... J'ai une chaîne dire, "a\\nb" et je veux que cela devienne "a\nb". J'ai essayé tout ce qui suit et aucun ne semble fonctionner;

>>> a
'a\\nb'
>>> a.replace("\\","\")
  File "<stdin>", line 1
    a.replace("\\","\")
                      ^
SyntaxError: EOL while scanning string literal
>>> a.replace("\\",r"\")
  File "<stdin>", line 1
    a.replace("\\",r"\")
                       ^
SyntaxError: EOL while scanning string literal
>>> a.replace("\\",r"\\")
'a\\\\nb'
>>> a.replace("\\","\\")
'a\\nb'

Je ne comprends vraiment pas pourquoi le dernier fonctionne, car cela fonctionne bien:

>>> a.replace("\\","%")
'a%nb'

Y a-t-il quelque chose qui me manque ici?

EDIT Je comprends que\est un caractère d'échappement. Ce que j'essaie de faire ici, c'est de tout tourner \\n\\t etc. en \n\t etc. et remplacer ne semblent pas fonctionner comme je l'avais imaginé.

>>> a = "a\\nb"
>>> b = "a\nb"
>>> print a
a\nb
>>> print b
a
b
>>> a.replace("\\","\\")
'a\\nb'
>>> a.replace("\\\\","\\")
'a\\nb'

Je veux que la chaîne a ressemble à la chaîne b. Mais remplacer ne remplace pas les barres obliques comme je le pensais.

31
kand

Il n'est pas nécessaire d'utiliser replace pour cela.

Ce que vous avez est une chaîne codée (en utilisant le string_escape encodage) et vous voulez le décoder:

>>> s = r"Escaped\nNewline"
>>> print s
Escaped\nNewline
>>> s.decode('string_escape')
'Escaped\nNewline'
>>> print s.decode('string_escape')
Escaped
Newline
>>> "a\\nb".decode('string_escape')
'a\nb'

Dans Python 3:

>>> import codecs
>>> codecs.decode('\\n\\x21', 'unicode_escape')
'\n!'
39
Jochen Ritzel

Vous manquez, c'est le caractère d'échappement.

Regardez ici: http://docs.python.org/reference/lexical_analysis.html à 2.4.1 "Séquence d'échappement"

Le plus important\n est un caractère de nouvelle ligne. Et \\ est un caractère d'échappement échappé: D

>>> a = 'a\\\\nb'
>>> a
'a\\\\nb'
>>> print a
a\\nb
>>> a.replace('\\\\', '\\')
'a\\nb'
>>> print a.replace('\\\\', '\\')
a\nb
8
sleeplessnerd

Votre chaîne d'origine, a = 'a\\nb' n'a pas réellement deux '\' caractères, le premier est une évasion pour le second. Si tu fais, print a, vous verrez que vous n'avez en fait qu'un seul '\' personnage.

>>> a = 'a\\nb'
>>> print a
a\nb

Si, cependant, vous voulez dire interpréter le '\n' en tant que caractère de nouvelle ligne, sans échapper à la barre oblique, puis:

>>> b = a.replace('\\n', '\n')
>>> b
'a\nb'
>>> print b
a
b
3
Santa

C'est parce que, même dans les chaînes "brutes" (= chaînes avec un r avant les guillemets de départ), un caractère d'échappement non échappé ne peut pas être le dernier caractère de la chaîne. Cela devrait plutôt fonctionner:

'\\ '[0]
1
Abbafei

Dans Python littéraux de chaîne, la barre oblique inverse est un caractère d'échappement. Cela est également vrai lorsque l'invite interactive vous montre la valeur d'une chaîne. Elle vous donnera la représentation littérale du code de la chaîne. Utilisez la print pour voir à quoi ressemble réellement la chaîne.

Cet exemple montre la différence:

>>> '\\'
'\\'
>>> print '\\'
\
1
Brian Goldman
r'a\\nb'.replace('\\\\', '\\')

ou

'a\nb'.replace('\n', '\\n')
1
nmichaels