我有一个正则表达式来检测表情符号:
{
players: [
{
_id: ObjectId("abc123"),
person: {
firstName: "John",
lastName: "Doe"
}
picture: "john.jpg"
}
],
seasons: [
name: "2015-2016",
seasonPlayers: [
{
player: {
person: {
firstName: "John",
lastName: "Doe"
}
picture: "john.jpg"
},
squadNumber: 10
}
]
]
}
我用这个命令测试:
emoji = u'(\ud83c[\udf00-\udfff]|\ud83d[\udc00-\ude4f\ude80-\udeff]|[\u2600-\u26FF\u2700-\u27BF])'
问题是如果在我的macOs机器中找到匹配项,但在Linux Debian上找到不
使用ipython 4.0.1和Python 2.7.11都来自conda发行版。
为什么问题在Linux上匹配?
答案 0 :(得分:1)
您的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下的正则表达式中添加以下字符范围:
UR '[\ U0001F600- \ U0001F64F]'
但根据here.
,它将打破Mac OS下的正则表达式2)切换到Python 3。
3)使用--enable-unicode = ucs4选项在Mac上重建你的python。