Python中相同的两个字符串被视为不同。

8

我有两个字符串,看起来完全相同:

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()它们都显示为字符串。
有没有办法可以看到“真正”的字符串?非常感谢您的帮助。

评论在跳过空格方面效果不太好,但repr()看起来也完全一样。 - David Yang
1个回答

23

它们不是相同的;使用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会对字符串中的任何非可打印或非ASCII字符进行转义,任何“有趣”的字符都会很明显。在Python 3中,使用ascii()函数可以得到与repr()相同的结果,因为该函数不那么保守,Unicode包含了一些一眼看起来相同的字符组合。

对于仍然看不出两者之间差别的字符串,上述的difflib工具也可以帮助指出究竟发生了什么变化。


啊,你说得完全正确——我肯定提供了错误的例子。但这个问题仍然存在——让我找一个真实的例子。 - David Yang
@DavidYang:Python不会欺骗你。看看repr()输出并比较这些值;像不间断空格这样的差异更加明显。 - Martijn Pieters
@DavidYang:更新使用difflib.ndiff来显示精确的差异。我一开始也错过了另一个区别。 - Martijn Pieters
我明白这一点,我不认为Python在撒谎,我只是觉得它没有把所有东西都展示给我。找到两个看起来相同但实际上不同的字符串已经被证明是相当困难的,因为我不能确切地搜索它。但是我可以说的是,尝试在两个列表之间找到共同的字符串没有任何结果,然而我百分之百确定这两个列表有交集,因为其中一个是从另一个创建的。 - David Yang
嗯,Martijn,我相信第二个差异才是实际原因!不知何故,当我使用第一个列表创建我的第二个列表时,它并不区分大小写,但现在我进行比较时,大小写敏感度很重要! - David Yang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接