私は以前のこの質問に対する回答を見ましたが、どれも最近ではなく、Python 3で私のために働いている人はいません。文字列のリストがあり、emojiが含まれているものを特定したいだけです。これを行う最速の方法は何ですか?Python文字列に絵文字が含まれているかどうかを調べる方法は?
具体的には、私はABテストの電子メールの件名リストが長いですし、どの件名に絵文字が含まれているかを調べようとしています。
私は以前のこの質問に対する回答を見ましたが、どれも最近ではなく、Python 3で私のために働いている人はいません。文字列のリストがあり、emojiが含まれているものを特定したいだけです。これを行う最速の方法は何ですか?Python文字列に絵文字が含まれているかどうかを調べる方法は?
具体的には、私はABテストの電子メールの件名リストが長いですし、どの件名に絵文字が含まれているかを調べようとしています。
this linkとthis linkの両方がカウントと他の一般的な文字を絵文字として使用します。また、前者は軽微な間違いがあり、後者はまだ動作していないようです。
ここに、this newer dataとthis 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が必要です。
正規表現モジュールが絵文字のプロパティをサポートしたら、代わりにその絵を使用する方が簡単になります。
絵文字または絵文字?そして、どんな意味でも、これがあなたに何を意味するのかを最初に定義しなければなりません。 –
私は[this](http://stackoverflow.com/a/28327594/6464893)を試してみることをお勧めします。 – Harrison
これまでのソリューションの大半はPython 3にうまく翻訳する必要があります。「作業してはいけない」とエラーメッセージを表示してください。 – Prune