【问题标题】:Emoji not detected with python regular expression in Linux在 Linux 中使用 python 正则表达式未检测到表情符号
【发布时间】:2016-01-08 14:34:54
【问题描述】:

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

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

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

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

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

为什么在 Linux 上匹配问题?

【问题讨论】:

  • 请编辑您的 Q 以显示未被捕获的示例表情符号。祝你好运。
  • 这个问题与是否狭窄的构建有关。但我的观点是 Anaconda 有不同的构建取决于系统。无论如何,如果代码是多系统的,唯一的方法是有两个选项:emoji = u'[\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]' try: unicodeCompile(emoji) except: emoji = u'(\ud83c[\udf00-\udfff]|\ud83d[\udc00-\ude4f\ude80-\udeff]|[\u2600-\u26FF\u2700-\u27BF])'

标签: python regex linux anaconda conda


【解决方案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 下将以下字符范围添加到您的正则表达式:

你的'[\U0001F600-\U0001F64F]'

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

2) 切换到 Python 3。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2017-01-24
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多