【发布时间】:2019-01-05 16:40:09
【问题描述】:
我有一个字符串,我想在Python2中re.sub这个字符串,所以我尝试了下面的语句,它工作了
>>> import re
>>> re.sub(u"[™®]", "", u"a™b®c")
'abc'
但是当我尝试以下语句时,它在两个 Windows 10 上都失败了(Python 2.7.15 |Anaconda, Inc.|(默认,2018 年 5 月 1 日,18:37:09)[MSC v.1500 64 位( AMD64)] 在 win32) 上。
>>> re.sub(ur"[\u2122\u00ae]", "", u"a™b®c")
u'a?b?c'
我已经尝试了Python and regular expression with Unicode 的解决方案,但也没有用。
>>> myre = re.compile(ur'[\u2122\u00ae]', re.UNICODE)
>>> print myre.sub('', u"a™b®c")
那么为什么会发生这种情况,我该如何解决呢?
【问题讨论】:
-
这不是你的问题,但你真的不应该尝试将 8 位字符串
""子转换为 Unicode 字符串u"a™b®c"。为了做到这一点,Python 必须猜测你是要编码一个还是解码另一个,即使它碰巧猜对了,你仍然依赖于一些不明显的东西,并且让你的代码有点慢,无缘无故。 -
@abarnert 是的,你是对的,我应该使用
u'' -
这在我的带有 python 2.7.14 的 linux 机器上运行良好。我无法重现您的错误。
-
@HåkenLid 是的,这段代码在 Ubuntu 上完美运行,我的问题是 Linux 是另一个发行版
-
Python 2 确实没有更好的解决方案。您可以小心始终使用
unicode值(编码和解码尽可能靠近边缘),也许使用 PEP 484 类型提示评论表单加上 Mypy 以确保您不会搞砸并使用str,永远不要在文字中使用 Unicode 字符等,但这仍然会很痛苦。如果有比 Python 2 更好的解决方案,Python 3 就不会存在。
标签: python regex windows python-2.7 python-unicode