替换python中的特殊字符

时间:2011-01-16 14:10:06

标签: python string

我有一些来自网络的文字:

一个£6.49

显然我希望将其显示为:

£6.49

到目前为止,我已尝试过以下内容:

s = url['title']
s = s.encode('utf8')
s = s.replace(u'Â','')

这方面有一些变种(在这个论坛上发现之后)

但是我一直没有运气:

  

UnicodeDecodeError:'ascii'编解码器   无法解码位置的字节0xc3   100:序数不在范围内(128)

有人能帮助我做到这一点吗?

更新:

添加repr示例和内容类型

u'Star Trek XI £3.99'
u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'
Content-Type: text/html; charset=utf-8

提前致谢。

2 个答案:

答案 0 :(得分:7)

如果,s=url['title']使s等于此:

In [48]: s=u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'

然后问题是

  1. 在定义url
  2. 的代码中
  3. 或者来自网络的内容是 恶意形成。
  4. 如果是案例1,我们需要查看定义url的代码。

    如果是案例2,那么快速而肮脏的解决方法是使用s编解码器对unicode对象raw-unicode-escape进行编码:

    In [49]: print(s)
    Oscar Winners Best Pictures Box Set £6.49
    
    In [50]: print(s.encode('raw-unicode-escape'))
    Oscar Winners Best Pictures Box Set £6.49
    

    另见SO question


    关于像s=u'Star Trek XI £3.99'这样的标题:同样,在它到达这个阶段之前修复问题会很好 - 也许是通过查看url的定义方式。但假设来自网络的内容格式错误,则解决方法是:

    In [86]: import re
    
    In [87]: print(re.sub(r'&#x([a-fA-F\d]+);',lambda m: unichr(int(m.group(1),base=16)),s))
    Star Trek XI £3.99
    

    一点点解释:

    请注意

    In [51]: x=u'£'
    In [53]: x.encode('utf-8')
    Out[53]: '\xc2\xa3'
    

    因此,使用u'£'编解码器编码的unicode对象utf-8将成为字符串对象'\xc2\xa3'

    不知何故,url['title']被定义为 unicode 对象 u'\xc2\xa3'。 (u有很大的不同!)

    因此,当我们希望u'\xc2\xa3'时,我们会'\xc2\xa3'。 使用u'\xc2\xa3'编解码器对unicode对象raw-unicode-escape进行编码会将其转换为'\xc2\xa3'

答案 1 :(得分:0)

编辑:您的对象已经在unicode中。在我看来,没有理由实际使用enocde / decode。

>>> print u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'.replace(u'Â','')
Oscar Winners Best Pictures Box Set £6.49

然而,在我看来,那里出了点问题。 unicode对象实际上不是unicode;见:

>>> print 'Oscar Winners Best Pictures Box Set \xc2\xa36.49'.decode('utf8')
Oscar Winners Best Pictures Box Set £6.49

您发布的repr()不应该是unicode对象。这就是为什么我问你在哪里得到数据,有什么不对。