2016-09-02 17 views
0

私は以前のこの質問に対する回答を見ましたが、どれも最近ではなく、Python 3で私のために働いている人はいません。文字列のリストがあり、emojiが含まれているものを特定したいだけです。これを行う最速の方法は何ですか?Python文字列に絵文字が含まれているかどうかを調べる方法は?

具体的には、私はABテストの電子メールの件名リストが長いですし、どの件名に絵文字が含まれているかを調べようとしています。

+3

絵文字または絵文字?そして、どんな意味でも、これがあなたに何を意味するのかを最初に定義しなければなりません。 –

+0

私は[this](http://stackoverflow.com/a/28327594/6464893)を試してみることをお勧めします。 – Harrison

+0

これまでのソリューションの大半はPython 3にうまく翻訳する必要があります。「作業してはいけない」とエラーメッセージを表示してください。 – Prune

答えて

1

this linkthis linkの両方がカウントと他の一般的な文字を絵文字として使用します。また、前者は軽微な間違いがあり、後者はまだ動作していないようです。

ここに、this newer datathis documentationを使用して控えめな側でエラーが発生する実装があります。ユニコード属性Emoji_Presentationでマークされたコードポイント、またはEmojiというマークが付けられたコードポイントのみを考慮します(デフォルトはテキストですが、が絵文字になります)。特殊文字セレクタコードポイントfe0fがあり、その代わりにデフォルトで絵文字が使用されます。私がこれは控えめだと言う理由は、特定のシステムがfe0fについては不安定ではないので、どこでも可能な限り文字を絵文字として扱うからです(詳細はhereを参照してください)。

import re 
from collections import defaultdict 


def parse_line(line): 
    """Return a pair (property, codepoints) where property is a string and 
     codepoints is a set of int unicode code points""" 
    pat = r'([0-9A-Z]+)(\.\.[0-9A-Z]+)? + ; +(\w+) + #.*' 
    match = re.match(pat, line) 
    assert match 

    codepoints = set() 

    start = int(match.group(1), 16) 

    if match.group(2): 
     trimmed = match.group(2)[2:] 
     end = int(trimmed, 16) + 1 
    else: 
     end = start + 1 

    for cp in range(start, end): 
     codepoints.add(cp) 

    return (match.group(3), codepoints) 


def parse_emoji_data(): 
    """Return a dictionary mapping properties to code points""" 
    result = defaultdict(set) 
    with open('emoji-data.txt', mode='r', encoding='utf-8') as f: 
     for line in f: 
      if '#' != line[0] and len(line.strip()) > 0: 
       property, cp = parse_line(line) 
       result[property] |= cp 
    return result 


def test_parse_emoji_data(): 
    sets = parse_emoji_data() 
    sizes = { 
     'Emoji': 1123, 
     'Emoji_Presentation': 910, 
     'Emoji_Modifier': 5, 
     'Emoji_Modifier_Base': 83, 
    } 
    for k, v in sizes.items(): 
     assert len(sets[k]) == v 


def contains_emoji(text): 
    """ 
    Return true if the string contains either a code point with the 
    `Emoji_Presentation` property, or a code point with the `Emoji` 
    property that is followed by \uFE0F 
    """ 
    sets = parse_emoji_data() 
    for i, ch in enumerate(text): 
     if ord(ch) in sets['Emoji_Presentation']: 
      return True 
     elif ord(ch) in sets['Emoji']: 
      if len(text) > i+1 and text[i+1] == '\ufe0f': 
       return True 
    return False 

test_parse_emoji_data() 
assert not contains_emoji('hello') 
assert not contains_emoji('hello :) :D 125% #%&*(@#%&[email protected](^*(') 
assert contains_emoji('here is a smiley \U0001F601 !!!') 

これを実行するには、作業ディレクトリにftp://ftp.unicode.org/Public/emoji/3.0/emoji-data.txtが必要です。

正規表現モジュールが絵文字のプロパティをサポートしたら、代わりにその絵を使用する方が簡単になります。

関連する問題