web-dev-qa-db-ja.com

Pythonの文字列から絵文字を削除する

私はこのコードをPythonで絵文字を削除するために見つけましたが、機能していません。他のコードで助けたり、これを修正できますか?

私はすべての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
_

リスト内の各アイテムは、Word _['This', 'dog', '\xf0\x9f\x98\x82', 'https://t.co/5N86jYipOI']_にすることができます

更新:私はこの他のコードを使用しました:

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

しかし、これでも絵文字は削除されず、表示されます!それはなぜですか? enter image description here

23
Mona Jalal

これは私のために動作します。 https://stackoverflow.com/a/43813727/6579239 が動機です。

def deEmojify(inputString):
    return inputString.encode('ascii', 'ignore').decode('ascii')
3

Python 2では、_u''_リテラルを使用して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_は一部の絵文字のみに一致します(すべてではありません)。 文字は絵文字 を参照してください。

36
jfs

受け入れられた回答の例を使用しても、「悪い文字範囲」エラーが表示される場合は、おそらくナロービルドを使用している可能性があります( 詳細はこの回答を参照 )。動作していると思われる正規表現の再フォーマットされたバージョンは次のとおりです。

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)
16
scwagner

絵文字の削除の完全版:

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)
11
Ali Tavakoli

回答を受け入れ、他の人も少しの間私のために働いたが、最終的には Basic Multilingual Plane 以外のすべてのキャラクターを取り除くことにした。これは、他のUnicodeプレーン(絵文字などが存在する)への将来の追加を除外します。つまり、新しいUnicode文字が追加されるたびにコードを更新する必要はありません:)。

In Python 2.7テキストがまだない場合はUnicodeに変換し、以下の負の正規表現を使用します(subs anythingnot正規表現では、BMPexcept2バイトを作成するために使用されるサロゲート Supplementary Multilingual Plane 文字)。

NON_BMP_RE = re.compile(u"[^\U00000000-\U0000d7ff\U0000e000-\U0000ffff]", flags=re.UNICODE)
NON_BMP_RE.sub(u'', unicode(text, 'utf-8'))
9
KevinTydlacka

ユニコードの完全なリストを収集しようとしました。ツイートから絵文字を抽出するために使用し、私にとって非常にうまく機能します。

# 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)
5
Chiheb.K

正規表現を使用したくない場合、最良の解決策は emoji python package を使用することです。

絵文字フリーテキストを返す簡単な関数を次に示します(これは SO answer のおかげです)。

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

Unicodeを扱う場合(@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'))
5
kingmakerking

なぜなら[...]は文字のセットのいずれかを意味し、ダッシュで区切られたグループ内の2文字は文字の範囲(多くの場合、「az」または「0-9」)を意味するため、パターンは「a x、{、1、F、6、0、1、範囲}〜x、{、1、F、6、4、fまたは} "の後にスラッシュと文字u"が続くグループ内の文字。真ん中のその範囲は、reが悪い文字の範囲と呼んでいるものです。

3
Bryan Oakley

これが私の解決策です。このソリューションは、python ???? ‍♂ and ???? ‍♀ではレンダリングできない追加の男性と女性の絵文字を削除します

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)
3
KT Works

文字列を次のような別の文字セットに変換すると役立つ場合があります。

text.encode('latin-1', 'ignore').decode('latin-1')

敬具。

1
Tobias Ernst

残念なことに、彼らはすべての答えを試してみましたが、彼らは新しいハグ顔絵文字を削除しませんでした????または素晴らしく眼鏡絵文字????または????、????など。

Githubのpython emojiパッケージから取得したすべての可能な絵文字のリストで終わりました。Stackoverflowの回答には3万文字の制限があり、7万文字を超えるため、Gistを作成する必要がありました。

0
octohedron

以下は、絵文字ライブラリのget_emoji_regexp()を使用するPython 3スクリプトです。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)
0
jeffhale