Emoji no detectado con la expresión regular de python en Linux

Tengo una expresión regular para detectar emojis:

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

y re.match(emoji, u'\U0001f602', re.UNICODE) # "😂" con este comando: re.match(emoji, u'\U0001f602', re.UNICODE) # "😂"

El problema es que si encuentra una coincidencia en mi máquina macOs, pero no en Linux Debian

Usando ipython 4.0.1 y Python 2.7.11 Ambos de la distribución de Conda.

¿Por qué el problema coincide en Linux?

Tu Mac OS tiene una comstackción de python estrecha . Prueba esto en esto:

 unichr(0x0001f602) 

Espero que tengas una excepción. Significa que su instalación de Python para Mac trata a los caracteres Unicode por encima de FFFF como dos caracteres.

 >>> 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> 

Observe cómo \ ud83d \ ude02 y \ U0001f602 producen los mismos bytes. Su sistema operativo Mac trata el carácter \ U0001f602 como los dos dígitos de 8 hexágonos \ ud83d \ ude02, que coinciden con su expresión regular. Linux lo trata como un solo dígito hexagonal de 16, que no coincide con ninguno de los rangos en su expresión regular.

Sus opciones son: 1) agregar el siguiente rango de caracteres a su expresión regular en Linux:

ur ‘[\ U0001F600- \ U0001F64F]’

Pero romperá la expresión regular en Mac OS, como se ve aquí.

2) cambiar a Python 3.

3) reconstruye tu python en Mac con la opción –enable-unicode = ucs4.