2016-12-05 6 views
1

Я использовал this post, чтобы создать регулярное выражение, которое найдет emojis в строке текста и просто вставьте некоторые символы пробела с обеих сторон. мои регулярные выражение коды:Surround emoji с пробелами

try: 
    # Wide UCS-4 build 
    oRes = re.compile(u'[' 
     u'\U0001F300-\U0001F64F' 
     u'\U0001F680-\U0001F6FF' 
     u'\u2600-\u26FF\u2700-\u27BF]+', 
     re.UNICODE) 
except re.error: 
    # Narrow UCS-2 build 
    oRes = re.compile(u'(' 
     u'\ud83c[\udf00-\udfff]|' 
     u'\ud83d[\udc00-\ude4f\ude80-\udeff]|' 
     u'[\u2600-\u26FF\u2700-\u27BF])+', 
     re.UNICODE) 

s2 = oRE.sub(r' \1 ', s1) 

Однако я получаю некоторое действительно странное поведение, где Emojis вывозятся, как в приведенном ниже примере. Любой совет будет принят во внимание. Я использую Python на MacBook. Благодарю.

ВХОД

هيلاري كلينتون "متنحة" وتشير إلى عملية غش في ولاية بانسيلفانيا العتيقة قائلة: "عند فرز الاصوات ..قطعوا الكهربا ✋" # ابو_الياس

ВЫВОД

هيلاري كلينتون "متنحة" وتشير إلى عملية غش في ولاية بانسيلفانيا العتيقة قائلة: "عند فرز الاصوات ..قطعوا الكهربا ✋ "# ابو_الياس

+1

Какую версию python вы используете? – timotree

+1

Спасибо за ваш ответ, я использую 2.7. –

+0

Добро пожаловать. Я не знаю много о unicode в python, так что кому-то придется ответить на ваш вопрос. – timotree

ответ

1

Следующие работы для меня после исправления размещения круглых скобок в ваших регулярных выражениях. В блоке try вам нужны круглые скобки вокруг всего, если вы хотите вообще создать группу \1; в блоке except круглые скобки должны быть включают+, в противном случае группа \1 будет захватывать только первый из нескольких соответствующих символов.

import re 
with open('input.txt', 'rb') as f: 
    s1 = f.read().decode('utf-8').strip() 

try: 
    # Wide UCS-4 build 
    oRes = re.compile(u'([' 
     u'\U0001F300-\U0001F64F' 
     u'\U0001F680-\U0001F6FF' 
     u'\u2600-\u26FF\u2700-\u27BF]+)', 
     re.UNICODE) 
except re.error: 
    # Narrow UCS-2 build 
    oRes = re.compile(u'((' 
     u'\ud83c[\udf00-\udfff]|' 
     u'\ud83d[\udc00-\ude4f\ude80-\udeff]|' 
     u'[\u2600-\u26FF\u2700-\u27BF])+)', 
     re.UNICODE) 

s2 = oRes.sub(r' \1 ', s1) 

with open('output.txt', 'wb') as f: 
    f.write((s1+'\n').encode('utf-8')) 
    f.write((s2+'\n').encode('utf-8')) 

Что касается отмены ваших персонажей, которые должны быть артефактом некоторого шага в вводе/выводе или копирование/вставке цепи не правильно обрабатывающей справа налево характера арабского языка. Это не для меня. Результаты выглядят хорошо, когда я открываю output.txt в TextWrangler на моем MacBook.

+0

Хороший улов. Я пропустил, что '+' не был в захвате. – timotree

+0

Я думаю, что это неверно в исключающем блоке. Обратите внимание, что в скобках содержатся операторы OR (|), что означает, что в текущем коде вы применяете только плюсы к последнему случаю ИЛИ. – Meyer

+0

Хм, @SMeyer прав. На самом деле, чтобы объединить * каждый символ emoji с пробелами (если это цель), необходимо удалить '+'. Чтобы окружить каждую последовательность эмози * * пробелами, нужны дополнительные скобки. Я добавлю лишние, потому что блок 'try' предполагает, что целью является целая последовательность. – jez

Смежные вопросы