【问题标题】:python replace and sub not working with unicode character u"\u0092"python replace 和 sub 不适用于 unicode 字符 u"\u0092"
【发布时间】:2018-05-30 15:30:57
【问题描述】:

Python 版本:Python 3.6。 我正在尝试用常规撇号替换 Unicode 字符 u"\u0092" (又名卷曲撇号)。

我已经尝试了以下所有方法:

    mystring = <some string with problem character>
    # option 1 
    mystring = mystring.replace(u"\u0092", u\"0027")
    # option 2 
    mystring = mystring.replace(u"\u0092", "'")
    # option 3
    mystring = re.sub('\u0092',u"\u0027", mystring)
    # option 4
    mystring = re.sub('\u0092',u"'", mystring)

以上都没有更新 mystring 中的字符。其他子和替换操作正在工作 - 这让我认为这要么是我使用 Unicode 字符的问题,要么是这个特定字符的问题。

更新:我也尝试了下面的建议,但都不起作用:

    mystring.decode("utf-8").replace(u"\u0092", u"\u0027").encode("utf-8")
    mystring.decode("utf-8").replace(u"\u2019", u"\u0027").encode("utf-8")

但它给了我错误:AttributeError: 'str' object has no attribute 'decode'

澄清一下:IDE 不是这里的核心问题。我的问题是为什么当我使用 Unicode 字符运行 replace 或 sub 并打印结果时它没有注册 - 该字符仍然存在于字符串中。

【问题讨论】:

  • str.decode("utf-8").replace(u"\u0092", u"\u0027").encode("utf-8")
  • 感谢您的建议 - 我在上面提到的另一个问题上看到了这一点,但它适用于 Python3 吗?当我尝试它时,我收到错误:AttributeError:'str' object has no attribute 'decode'
  • 所有字符串在 python3 中都是 unicode。你不需要到处都有us 和编码的所有民间传说。只需string.replace("’", "'")(事实上,我在我的回答中假设你正在运行python2)
  • 如果我尝试直接使用该字符 - 有或没有 u 的前缀,我会收到此错误: SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0x92 in position 0:无效的起始字节

标签: python regex string text


【解决方案1】:

您的代码是错误的,它是 \u2019 用于撇号 (')。来自维基百科

U+0092 146 私人使用 2 PU2​​

这就是日食不开心的原因。


使用正确的代码:

#_*_ coding: utf8 _*_
import re
string = u"dkfljglkdfjg’fgkljlf"
string = string.replace(u"’", u"'"))
string = string.replace(u"\u2019", u"\u0027")
string = re.sub(u'\u2019',u"\u0027", string)
string = re.sub(u'’',u"'", string)

所有解决方案都有效

不要调用你的变量str

【讨论】:

  • 第一部分对我不起作用,因为 Eclipse 不能直接识别字符。第二部分也有同样的问题 - 当我打印结果时,它仍然是相同的大括号并且未通过比较测试。
  • 我从未使用过 eclipse,但如果它不能识别常规的 unicode 字符,我会感到非常惊讶
  • 抱歉-正如我在问题中提到的那样,我尝试了其中的几个,而其他的也不起作用...是否使用 u 的前缀似乎没有区别
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 2021-05-10
  • 1970-01-01
  • 2019-12-23
  • 2016-12-20
  • 2015-08-20
  • 2018-04-01
  • 1970-01-01
相关资源
最近更新 更多