【发布时间】:2019-04-22 08:02:10
【问题描述】:
我有一个来自 emoji 包的 unicode 符号列表。我的最终目标是创建一个函数,将 unicode 字符串作为输入,即some????????thing,然后删除所有表情符号,即"something"。以下是我想要实现的目标的演示:
from emoji import UNICODE_EMOJI
text = 'some????????thing'
exclude_list = UNICODE_EMOJI.keys()
output = ... = 'something'
我一直在尝试执行上述操作,在此过程中,我遇到了一个奇怪的行为,如下所示,如您所见。我相信如果下面的代码是固定的,那么我将能够实现我的最终目标。
import regex as re
print u'\U0001F469' # ????
print u'\U0001F60C' # ????
print u'\U0001F469\U0001F60C' # ????????
text = u'some\U0001F469\U0001F60Cthing'
print text # some????????thing
# Removing "????????" works
print re.sub(ur'[\U0001f469\U0001F60C]+', u'', text) # something
# Removing only "????" doesn't work
print re.sub(ur'[\U0001f469]+', u'', text) # some�thing
【问题讨论】:
-
我可以在 Mac OS X 10.13.6 上的 Python 2.7.10 中重现这个错误。在
print语句中插入repr表明re.sub的结果是u'some\ude0cthing'。 (顺便说一下,sys.maxunicode是 65535。) -
Python 2 对 BMP 之外的字符没有很好的 Unicode 支持。如果你真的需要它,你需要一个带有 32 位 Unicode 字符的 Python 版本。否则开始使用更高版本的 Python 3。
-
@jwodder:打败我????我敢打赌,它们在内部存储为 2 字节 代理字符,
re也将它们视为 2 个单独的字符 - 即删除\u0001的第一个字符。 -
哦等等,不是
\u0001——它从不看到这些。它首先替换正确的代理,然后 然后 替换这些。由[..]括起来,一次一个,首先是高位,然后是低位。 -
向我尖叫文本格式错误。将所有符合 unicode 的文本转换为 ascii 然后搜索适当的字符串会不会令人望而却步?不优雅,但可能会解决 2 字节代理问题?
标签: regex python-2.7 unicode