Ответ 1
Это работает для меня. Это мотивировано fooobar.com/questions/6561790/...
def deEmojify(inputString):
return inputString.encode('ascii', 'ignore').decode('ascii')
Я нашел этот код в Python для удаления emojis, но он не работает. Можете ли вы помочь с другими кодами или исправить это?
Я заметил, что все мои emjois начинаются с \xf
, но когда я пытаюсь выполнить поиск str.startswith("\xf")
, я получаю недопустимую ошибку символа.
emoji_pattern = r'/[x{1F601}-x{1F64F}]/u'
re.sub(emoji_pattern, '', word)
Здесь ошибка:
Traceback (most recent call last):
File "test.py", line 52, in <module>
re.sub(emoji_pattern,'',word)
File "/usr/lib/python2.7/re.py", line 151, in sub
return _compile(pattern, flags).sub(repl, string, count)
File "/usr/lib/python2.7/re.py", line 244, in _compile
raise error, v # invalid expression
sre_constants.error: bad character range
Каждый из элементов в списке может быть словом ['This', 'dog', '\xf0\x9f\x98\x82', 'https://t.co/5N86jYipOI']
UPDATE: Я использовал этот другой код:
emoji_pattern=re.compile(ur" " " [\U0001F600-\U0001F64F] # emoticons \
|\
[\U0001F300-\U0001F5FF] # symbols & pictographs\
|\
[\U0001F680-\U0001F6FF] # transport & map symbols\
|\
[\U0001F1E0-\U0001F1FF] # flags (iOS)\
" " ", re.VERBOSE)
emoji_pattern.sub('', word)
Но это все еще не удаляет эмозис и показывает их! Есть ли подсказка, почему?
Это работает для меня. Это мотивировано fooobar.com/questions/6561790/...
def deEmojify(inputString):
return inputString.encode('ascii', 'ignore').decode('ascii')
На Python 2 вы должны использовать u''
literal для создания строки Unicode. Кроме того, вы должны передать флаг re.UNICODE
и преобразовать ваши входные данные в Unicode (например, text = data.decode('utf-8')
):
#!/usr/bin/env python
import re
text = u'This dog \U0001f602'
print(text) # with emoji
emoji_pattern = re.compile("["
u"\U0001F600-\U0001F64F" # emoticons
u"\U0001F300-\U0001F5FF" # symbols & pictographs
u"\U0001F680-\U0001F6FF" # transport & map symbols
u"\U0001F1E0-\U0001F1FF" # flags (iOS)
"]+", flags=re.UNICODE)
print(emoji_pattern.sub(r'', text)) # no emoji
This dog 😂
This dog
Примечание: emoji_pattern
соответствует только некоторым emoji (не всем). Посмотрите, какие персонажи являются Emoji.
Если вы используете пример из принятого ответа и все еще получаете ошибки "неправильного диапазона символов", вы, вероятно, используете узкую сборку (см. этот ответ для более подробной информации). Переформатированная версия регулярного выражения, которая, похоже, работает:
emoji_pattern = re.compile(
u"(\ud83d[\ude00-\ude4f])|" # emoticons
u"(\ud83c[\udf00-\uffff])|" # symbols & pictographs (1 of 2)
u"(\ud83d[\u0000-\uddff])|" # symbols & pictographs (2 of 2)
u"(\ud83d[\ude80-\udeff])|" # transport & map symbols
u"(\ud83c[\udde0-\uddff])" # flags (iOS)
"+", flags=re.UNICODE)
Завершить vesrion Удаление emojies:
def remove_emoji(string):
emoji_pattern = re.compile("["
u"\U0001F600-\U0001F64F" # emoticons
u"\U0001F300-\U0001F5FF" # symbols & pictographs
u"\U0001F680-\U0001F6FF" # transport & map symbols
u"\U0001F1E0-\U0001F1FF" # flags (iOS)
u"\U00002702-\U000027B0"
u"\U000024C2-\U0001F251"
"]+", flags=re.UNICODE)
return emoji_pattern.sub(r'', string)
Принятый ответ, и другие немного подействовали на меня, но в итоге я решил лишить всех персонажей за пределами Базовой многоязычной плоскости. Это исключает будущие дополнения к другим плоскостям Юникода (где живут эмодзи и тому подобное), что означает, что мне не нужно обновлять мой код каждый раз, когда добавляются новые символы Юникода :).
В Python 2.7 конвертируйте в юникод, если ваш текст еще не существует, а затем используйте отрицательное регулярное выражение, приведенное ниже (содержит все, что не в регулярном выражении, которое представляет собой все символы из BMP, за исключением суррогатов, которые используются для создания 2-байтовых символов дополнительной многоязычной плоскости).
NON_BMP_RE = re.compile(u"[^\U00000000-\U0000d7ff\U0000e000-\U0000ffff]", flags=re.UNICODE)
NON_BMP_RE.sub(u'', unicode(text, 'utf-8'))
Если вы не заинтересованы в использовании регулярных выражений, лучшим решением может быть использование пакета Emoji Python.
Вот простая функция для возврата свободного текста смайликов (благодаря такому ответу):
import emoji
def give_emoji_free_text(text):
allchars = [str for str in text.decode('utf-8')]
emoji_list = [c for c in allchars if c in emoji.UNICODE_EMOJI]
clean_text = ' '.join([str for str in text.decode('utf-8').split() if not any(i in str for i in emoji_list)])
return clean_text
Если вы имеете дело со строками, содержащими смайлики, это просто
>> s1 = "Hi 🤔 How is your 🙈 and 😌. Have a nice weekend 💕👭👙"
>> print s1
Hi 🤔 How is your 🙈 and 😌. Have a nice weekend 💕👭👙
>> print give_emoji_free_text(s1)
Hi How is your and Have a nice weekend
Если вы имеете дело с юникодом (как в примере с @jfs), просто закодируйте его с помощью utf-8.
>> s2 = u'This dog \U0001f602'
>> print s2
This dog 😂
>> print give_emoji_free_text(s2.encode('utf8'))
This dog
Правки
Основываясь на комментарии, это должно быть так же просто, как:
def give_emoji_free_text(text):
return emoji.get_emoji_regexp().sub(r'', text.decode('utf8'))
Я попытался собрать полный список юникодов. Я использую его для извлечения смайликов из твитов, и это работает очень хорошо для меня.
# Emojis pattern
emoji_pattern = re.compile("["
u"\U0001F600-\U0001F64F" # emoticons
u"\U0001F300-\U0001F5FF" # symbols & pictographs
u"\U0001F680-\U0001F6FF" # transport & map symbols
u"\U0001F1E0-\U0001F1FF" # flags (iOS)
u"\U00002702-\U000027B0"
u"\U000024C2-\U0001F251"
u"\U0001f926-\U0001f937"
u'\U00010000-\U0010ffff'
u"\u200d"
u"\u2640-\u2642"
u"\u2600-\u2B55"
u"\u23cf"
u"\u23e9"
u"\u231a"
u"\u3030"
u"\ufe0f"
"]+", flags=re.UNICODE)
Потому что [...]
означает любой из набора символов, а потому, что два символа в группе, разделенные тире, означают диапазон символов (часто "az" или "0-9" ), ваш паттерн говорит: косой чертой, за которой следуют любые символы в группе, содержащей x, {, 1, F, 6, 0, 1, диапазон} через x, {, 1, F, 6, 4, f или} ", за которым следует косая черта и буква u". Этот диапазон в середине - это то, что re вызывает неправильный диапазон символов.
это мое решение. Это решение устраняет дополнительные эмоции для мужчин и женщин, которые не могут быть покорены питоном 🤷♂ и 🤦♀
emoji_pattern = re.compile("["
u"\U0001F600-\U0001F64F" # emoticons
u"\U0001F300-\U0001F5FF" # symbols & pictographs
u"\U0001F680-\U0001F6FF" # transport & map symbols
u"\U0001F1E0-\U0001F1FF" # flags (iOS)
u"\U00002702-\U000027B0"
u"\U000024C2-\U0001F251"
u"\U0001f926-\U0001f937"
u"\u200d"
u"\u2640-\u2642"
"]+", flags=re.UNICODE)
Перепробовал все ответы, к сожалению, они не убрали новое смайлик с обнимающимся лицом или чокнутые очки смайликов "или", и многое другое.
Закончился списком всех возможных смайликов, взятых из пакета python emoji на github, и мне пришлось создать гист, потому что существует ограничение в 30 тыс. Символов для ответов stackoverflow и более 70 тыс. Символов.
Преобразование строки в другой набор символов, подобный этому, может помочь:
text.encode('latin-1', 'ignore').decode('latin-1')
С уважением.
Вот сценарий Python 3, который использует библиотеку emoji get_emoji_regexp()
- как предложено kingmakerking и Martijn Pieters в их ответе/комментарии.
Он читает текст из файла и записывает текст без смайликов в другой файл.
import emoji
import re
def strip_emoji(text):
print(emoji.emoji_count(text))
new_text = re.sub(emoji.get_emoji_regexp(), r"", text)
return new_text
with open("my_file.md", "r") as file:
old_text = file.read()
no_emoji_text = strip_emoji(old_text)
with open("file.md", "w+") as new_file:
new_file.write(no_emoji_text)
Полная версия удаления Emojis
✍ 🌷 📌 👈🏻 🖥
def remove_emojis(data):
emoj = re.compile("["
u"\U0001F600-\U0001F64F" # emoticons
u"\U0001F300-\U0001F5FF" # symbols & pictographs
u"\U0001F680-\U0001F6FF" # transport & map symbols
u"\U0001F1E0-\U0001F1FF" # flags (iOS)
u"\U00002500-\U00002BEF" # chinese char
u"\U00002702-\U000027B0"
u"\U00002702-\U000027B0"
u"\U000024C2-\U0001F251"
u"\U0001f926-\U0001f937"
u"\U00010000-\U0010ffff"
u"\u2640-\u2642"
u"\u2600-\u2B55"
u"\u200d"
u"\u23cf"
u"\u23e9"
u"\u231a"
u"\ufe0f" # dingbats
u"\u3030"
"]+", re.UNICODE)
return re.sub(emoj, '', data)