Как построить регулярный словарь смайликов в питоне?

У меня есть список кодов смайликов внутри файла UTF32.red.codes в виде обычного текста. Простое содержимое файла

\U0001F600
\U0001F601
\U0001F602
\U0001F603 
\U0001F604
\U0001F605
\U0001F606
\U0001F609
\U0001F60A
\U0001F60B

Основываясь на вопросе, моя идея состоит в том, чтобы создать регулярное выражение из содержимого файла, чтобы поймать смайлики. Это мой минимальный рабочий пример

import re

with open('UTF32.red.codes','r') as emof:
   codes = [emo.strip() for emo in emof]
   emojis = re.compile(u"(%s)" % "|".join(codes))

string = u'string to check \U0001F601'
found = emojis.findall(string)

print found

found всегда пусто. Где я не прав? Я использую питон 2.7


person emanuele    schedule 08.01.2016    source источник
comment
Где string to check в вашем файле? Этого не должно быть в string, я полагаю. Кроме того, имя переменной string может сбивать с толку, поэтому лучше воздержаться от этого.   -  person N. Wouda    schedule 08.01.2016
comment
Это строка для перехвата \U0001F601   -  person emanuele    schedule 08.01.2016
comment
Затем выполните string = u'\U0001F601'. Еще лучше использовать другое имя переменной, например search или что-то подобное.   -  person N. Wouda    schedule 08.01.2016
comment
Ты прав. Эта информация отсутствует. питон 2.7   -  person emanuele    schedule 08.01.2016
comment
Сталкиваетесь ли вы с какими-либо ошибками? Я думаю, что нам нужно больше информации, если мы хотим решить эту проблему.   -  person N. Wouda    schedule 08.01.2016
comment
Нет ошибок. Просто введите пустой список в конце скрипта. Я использую MacbookPro   -  person emanuele    schedule 08.01.2016
comment
Более важно то, с какой версией Python вы пытаетесь работать — строка в Python 3 всегда имеет кодировку Unicode, но не в Python 2.   -  person Steve Barnes    schedule 09.01.2016


Ответы (2)


Ваш код будет работать нормально в Python 3 (просто исправьте print found на print(found)). Однако в python 2.7 это не будет работать, так как в его модуле re есть известная ошибка (см. эту тему и эта проблема).

Если вам все еще нужна версия кода для Python 2, просто используйте модуль regex, который можно установить вместе с pip2 install regex. Импортируйте его с import regex, затем замените все операторы re. на regex. (т.е. regex.compile и regex.findall) и все. Это должно работать.

person vrs    schedule 08.01.2016
comment
Как вы думаете, почему ошибка связана с этой проблемой? - person tripleee; 11.01.2016

Этот код работает с Python 2.7.

import re
with open('UTF32.red.codes','rb') as emof:
    codes = [emo.decode('unicode-escape').strip() for emo in emof]
    emojis = re.compile(u"(%s)" % "|".join(map(re.escape,codes)))

search = ur'string to check \U0001F601'
found = emojis.findall(search)

print found
person emanuele    schedule 11.01.2016