2014-09-09 3 views
0

У меня есть две строки, по всей индикации выглядят идентично:Python две одинаковые строки рассматриваются как Different

x1 = 'N C Soft - NCSOFT_Guild Wars 2 December 2013 :: BNLX_AD_Parallax_160x600' 
x2 = 'N C Soft - NCSOFT_Guild Wars 2 December 2013 :: BNLX_CT_Parallax_160X600' 

Однако проверка на равенство показывает, что они не являются.

In [312]: if x1 != x2: 
    .....:  print 'yep' 
    .....: 
yep 

Я также попытался скопировать обе строки из командной строки и их вставить их обратно в качестве новых переменных, но они по-прежнему не равны. Я на 80% уверен, что это потому, что они закодированы странным образом, причем некоторые нечетные символы вставлены, которые я не вижу, но используя type(), они просто отображаются как строка.

Есть ли способ увидеть «настоящую» строку? Любая помощь приветствуется.

+0

Комментарии не работают слишком хорошо с точки зрения пропуска пробела, но res() выглядят одинаково, как и –

ответ

4

Это не то же самое; используя difflib.ndiff() показывает, как эти два значения очень четко различаются:

>>> import difflib 
>>> print '\n'.join(difflib.ndiff([x1], [x2])) 
- N C Soft - NCSOFT_Guild Wars 2 December 2013 :: BNLX_AD_Parallax_160x600 
?              ^^   ^

+ N C Soft - NCSOFT_Guild Wars 2 December 2013 :: BNLX_CT_Parallax_160X600 
?              ^^   ^

В общем, при использовании сомнения repr() посмотреть на представление. Python 2 будет использовать escape-последовательности для любого непечатаемого или не-ASCII-символа в строке, любые «забавные» персонажи будут выделяться, как больной палец. В Python 3 используйте ascii() function для того же результата, что и repr(), и менее консервативен, и Unicode изобилует комбинациями символов, которые выглядят одинаково на первый взгляд.

Для строк, в которых вы все еще не можете видеть, какие изменения между ними, приведенный выше инструмент difflib также может помочь указать, что именно изменилось.

+0

А, вы абсолютно правы - я здесь указал неверный пример. Но эта проблема по-прежнему реальна - позвольте мне найти реальный пример. –

+0

@DavidYang: Python не лжет вам. Посмотрите на вывод 'repr()' и сравните эти значения; различия, такие как неразрывные пробелы, гораздо более заметны. –

+0

@DavidYang: обновлен, чтобы использовать 'difflib.ndiff', чтобы показать точные различия. Есть еще одна разница, которую я тоже пропустил. –

Смежные вопросы