表情符号在Linux中没有被python正则expression式检测到

我有一个正则expression式来检测emojis:

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

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

问题是如果在我的macOs机器中发现匹配,而不是在Linux Debian上

使用ipython 4.0.1和Python 2.7.11两者都来自conda发行版。

为什么在Linux上匹配的问题?

Solutions Collecting From Web of "表情符号在Linux中没有被python正则expression式检测到"

你的Mac OS有一个狭窄的Python构建 。 试试这个:

 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和\ U0​​001f602是如何产生相同的字节的。 您的Mac OS将字符\ U0001f602视为与您的正则表达式匹配的两个8位十六进制数字\ ud83d \ ude02。 Linux将它视为一个16位十六进制数字,与您的正则表达式中的任何范围都不匹配。

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

UR '[\ U0001F600- \ U0001F64F]'

但它会打破在Mac OS下的正则表达式,按照这里。

2)切换到Python 3。

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