Как я могу извлечь только смайлики из UTF-8 с регулярным выражением в Python? - PullRequest
0 голосов
/ 12 июня 2019

env python3.6 Там есть кодированный в utf-8 текст, подобный этому

text_utf8 = b"\xf0\x9f\x98\x80\xef\xbc\x81\xef\xbc\x81\xef\xbc\x81"

И я хочу искать только элементы, за которыми следуют три цифры или алфавита b'\xf0\x9f\x98\' - это фактически указывает на выражение лица эмодзи.

Я пробовал это

if re.search(b'\xf0\x9f\x98\[a-zA-Z0-9]{3}$', text_utf8)

но это не работает, и когда я распечатываю его, получается, что b'\xf0\x9f\x98\\[a-zA-Z1-9]{3}' и \ автоматически попадают в него. Есть выход? спасибо.

1 Ответ

1 голос
/ 12 июня 2019

Я вижу две проблемы с вашим поиском:

  1. вы пытаетесь найти текстовое представление строки utf8 (\xXX представляет байт в шестнадцатеричном формате),То, что вы на самом деле должны делать, - это сопоставление с контентом (фактическими байтами).
  2. вы включаете маркер конца строки ($) в свой поиск,где вы, вероятно, заинтересованы в его появлении где-либо в строке.

Должно работать что-то вроде следующего, хотя и хрупкое (более надежное решение см. ниже):

re.search(b'\xf0\x9f\x98.', text_utf8)

Это даст вам первое появление 4-байтовых последовательностей Unicode с префиксом \xf0\x9f\x98.

Если вы имеете дело с только с UTF-8, это должно у TTBOMK иметь однозначные совпадения(т.е. вам не нужно беспокоиться о появлении этого префикса в середине более длинной последовательности).


Более надежное решение, если у вас есть опция сторонних модулей, будетустановка модуля regex и использование следующего:

regex.search('\p{Emoji=Yes}', text_utf8.decode('utf8'))

Преимущества этого метода в том, что он более читабелен и понятен, а также, вероятно, более перспективен на будущее.(См. здесь для получения дополнительных свойств Юникода, которые могут помочь в вашем случае использования)

Обратите внимание, что в этом случае вы также можете иметь дело с text_utf8 как фактическим unicode (str в строке py3), без преобразования ее в байтовую строку, что может иметь другие преимущества в зависимости от остальной части вашего кода.

...