在Linux中没有使用python正则表达式检测到表情符号

时间:2016-01-08 14:34:54

标签: python regex linux anaconda conda

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

{ 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上匹配?

1 个答案:

答案 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和\ U0​​001f602如何生成相同的字节。您的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。