【问题标题】:Is there something that looks like white space but it is not and how to remove it?是否有一些看起来像空白但它不是以及如何删除它的东西?
【发布时间】:2015-10-27 14:02:25
【问题描述】:

我有一个似乎有很多空格的字符串(实际上在每个符号之间我看到一个空格)。为了清楚起见,这是字符串:

{ " d a t a " : { " i d " : " 1 0 b a 8 7 3 8 - b 0 0 9 - 4 1 2 0 - 9 e c 1 - 4 1 7 a 6 e a 1 a 6 1 f " , " t i m e " : 1 4 4 5 2 6 0 9 8 6 7 5 2 } , " e x p i r e s " : 1 4 5 3 0 9 6 7 8 6 7 5 2 } 

我尝试像往常一样删除空格:

z = z.replace(" ","")

但它不起作用。例如这段代码:

print type(z), len(z)
z = z.replace(" ","")
print type(z), len(z)

打印以下内容:

<type 'str'> 198
<type 'str'> 198

因此,删除空格后,字符串的长度与之前相同。除此之外,我将新字符串(应该删除空格的位置)保存到文本文件中。当我用文本编辑器打开这个文件时,我确实看到了空格!如果我尝试使用文本编辑器(使用搜索和替换)删除它们,它们就会被删除。

那么,我的问题是为什么 Python 不能删除这些“特殊”空格以及如何删除它们?

【问题讨论】:

  • 您是否尝试过检查,例如z[0] == ' '(与实际空间比较),或ord(z[0]),或查看repr(z),或...这些数据来自哪里?
  • 来源是什么?它是 utf-16 编码的文本吗(也许您将零字节视为空白)?你试过print z.decode('utf-16le')吗?
  • 可能是 unicode 吗?
  • 您可以遍历字符串并查看每个字符是什么:for c in my_str: print ord(c)。一个空格会产生32;其他值将指示您的未知字符是什么。
  • 如果是任何实际的空格,你可以使用正则表达式:import re; re.sub(r'\s','',z)

标签: python string replace special-characters


【解决方案1】:

我已经厌倦了使用 ord(c) 并且对于我解释为空格的字符,我得到了 0。

表示输入数据为utf-16文本。如果零字节跟在看似 ascii 字符的后面,例如 b'a\0',那么它就是 'utf-16le'(小端序):

>>> b'd\0a\0t\0a\0'.decode('utf-16le')
u'data'

不要使用.replace(b'\0', b'');它将在第一个非 ascii 字符处中断,例如 b'\xac '(使用 utf-16le 字符编码的欧元符号)。

【讨论】:

    【解决方案2】:

    由于您在上一条评论中说 ord(c) 为该字符返回 0,因此您可以稍微更改代码并删除此特定的空字符:

    z = z.replace(chr(0), "")
    

    现在它不应包含任何“空白”:

    print z
    >> {"data":{"id":"10ba8738-b009-4120-9ec1-417a6ea1a61f","time":1445260986752},"expires":1453096786752}
    

    编辑:

    这里还有一个ASCII表的链接,可以看到是空字符:

    http://www.ascii-code.com/

    【讨论】:

    • 谢谢。顺便说一句,以下解决方案(在 cmets 中提出)也有效:z = z.decode('utf-16le').
    • @Roman 是的,如果您必须对字符串执行其他操作,那应该会更好。从这里很难猜出你的文件的编码,所以我提出了这个有点幼稚但有效的方法。
    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多