Linux 中的 python 正则表达式未检测到表情符号

Emoji not detected with python regular expression in Linux

我有一个正则表达式来检测表情符号:

emoji = u'(\ud83c[\udf00-\udfff]|\ud83d[\udc00-\ude4f\ude80-\udeff]|[\u2600-\u26FF\u2700-\u27BF])'

我用这个命令测试: re.match(emoji, u'\U0001f602', re.UNICODE) # ""

问题是,如果在我的 macOs 机器上找到匹配项,但在 Linux Debian

没有

使用 ipython 4.0.1 和 Python 2.7.11 均来自 conda 发行版。

为什么问题匹配 Linux?

您的 Mac OS 有一个 narrow python build。试试这个:

unichr(0x0001f602)

我希望你会得到一个例外。这意味着您的 Mac python 安装将 FFFF 以上的 unicode 字符视为两个字符。

>>> u'\ud83d\ude02'.encode('utf8')
'\xf0\x9f\x98\x82'

>>> u'\U0001f602'.encode('utf8')
'\xf0\x9f\x98\x82'

>>> re.match(emoji, u'\ud83d\ude02', re.UNICODE)
<_sre.SRE_Match object at 0x7fdf7405d6c0>

注意 \ud83d\ude02 和 \U0001f602 如何产生相同的字节。您的 Mac OS 将字符 \U0001f602 视为两个 8 位十六进制数字 \ud83d\ude02,这与您的正则表达式匹配。 Linux 将其视为单个 16 位十六进制数字,与您的正则表达式中的任何范围都不匹配。

您的选择是:1) 在 Linux 下的正则表达式中添加以下字符范围:

你的'[\U0001F600-\U0001F64F]'

但它会破坏 Mac OS 下的正则表达式,根据 here.

2) 切换到 Python 3.

3) 使用 --enable-unicode=ucs4 选项在 Mac 上重建你的 python。