2017-11-13 9 views
5

私は、python文字列で顔文字を検索しようとしています。Pythonで適切なユニコード文字リストを取得する方法

'This is a test string '

の検索em_testが、私は実際にそれを見つけることができるかどうか は、だから私は、例えば、

em_test = ['\U0001f680'] 
print(em_test) 
[''] 
test = 'This is a test string ' 
if any(x in test for x in em_test): 
    print ("yes, the emoticon is there") 
else: 
    print ("no, the emoticon is not there") 

yes, the emoticon is there 

を持っています。

私は自分のユニコードで定義したいすべての絵文字でcsvファイルを作成しました。 CSVは、次のようになります。

\U0001F600

\U0001F601

\U0001F602

\U0001F923

を、私はそれをインポートし、それを印刷するとき、私はactullay絵文字を得ることはありませんが、むしろ単なるテキスト表現:

['\\U0001F600', 
'\\U0001F601', 
'\\U0001F602', 
'\\U0001F923', 
... 
] 

ので、私はこれを使用することはできませんこれらの絵文字を別の文字列で検索してください... 二重バックスラッシュは一意のスラッシュを表しているに過ぎませんが、何とかユニコードリーダーはそれを取得しません...私は何が欠けているのか分かりません。

提案がありますか?

+0

改行がないのは確かですか? –

答えて

2

あなたは.decode('unicode-escape')とそれらのUnicodeエスケープ・シーケンスを復号することができます。ただし、.decodebytesメソッドなので、これらのシーケンスがバイトではなくテキストである場合は、最初にバイトにエンコードする必要があります。あるいは、CSVファイルをバイナリモードで開いて(おそらく)、テキスト文字列ではなくbytesというシーケンスを読み取ることができます。

ちょうど楽しみのために、私もunicodedataを使用してそれらの名字を取得します。

import unicodedata as ud 

emojis = [ 
    '\\U0001F600', 
    '\\U0001F601', 
    '\\U0001F602', 
    '\\U0001F923', 
] 

for u in emojis: 
    s = u.encode('ASCII').decode('unicode-escape') 
    print(u, ud.name(s), s) 

これはast.literal_evalを使用するよりもはるかに高速である必要があり、出力

\U0001F600 GRINNING FACE 
\U0001F601 GRINNING FACE WITH SMILING EYES 
\U0001F602 FACE WITH TEARS OF JOY 
\U0001F923 ROLLING ON THE FLOOR LAUGHING 

。また、バイナリモードでデータを読み込むと、ファイルを読み込んでいる間に最初のデコードステップを回避できるだけでなく、.encode('ASCII')呼び出しを排除できるので、さらに高速になります。

あなたは

u.encode('Latin1').decode('unicode-escape') 

を使用してデコード少しより堅牢にすることができますが、それはあなたの絵文字データのために必要ではありません。以前に述べたように、バイナリモードでファイルを開くと、エンコードする必要がなくなります。

+0

これは素晴らしいことです。 '\ U00023EB' - > SyntaxErrorのエラーが発生する:(unicode error) 'unicodeescape'コーデックが0-8のバイトをデコードできない:切り詰められた\ UXXXXXXXXエスケープ – Bullzeye

+0

@Bullzeye Pythonが考える''\ U00023EB''を無効にする:" Big U "Unicodeエスケープ**は8桁の16進数を含む必要があります。私は自分のコードでそれを処理することができますが、おそらくCSVを構築するコードに修正する方が良いでしょう。 –

+0

はい、ちょうどそのサイトから取得した次のコードU + 23EBがhttps://unicode.org/emoji/charts/full-emoji-list.htmlから来たのかと疑問に思っています – Bullzeye

1

1-であるとして、あなたのCSVを維持:それは肥大化したソリューションです

が、ast.literal_eval作品使用:

import ast 

s = '\\U0001F600' 

x = ast.literal_eval('"{}"'.format(s)) 
print(hex(ord(x))) 
print(x) 

私は(正しい文字コードである)0x1f600を取得し、いくつかの絵文字の文字を()。 (よく私はこの答えのテキストフィールドに自分のコンソールから奇妙な文字をコピー/ペーストしなければならなかったが、それは動作しますそれ以外の場合は私の終わりまでに、コンソールの問題、だ)astを文字列として入力を取ることができるように

はちょうど引用符で囲みます。

print(chr(0x1F600)) 

がまったく同じことを(そうastがある:直接多分

あなたは文字コード自体の代わりに、\U形式を格納することによって、したほうが良いと思います

2.使用する文字コードややオーバーキル)

あなたのcsvには以下が含まれています:

0x1F600 
0x1F601 
0x1F602 
0x1F923 

それを読み取るときにchr(int(row[0],16))がトリックを行うだろう:例えば場合は、1つの1つのCSVの行(または最初の行)

with open("codes.csv") as f: 
    cr = csv.reader(f) 
    codes = [int(row[0],16) for row in cr] 
+0

ok - プリントがうまくいきます! chs(int(row [0]、16))の部分を取得しないでください。たとえば、pos_emo_twitter = pandas.read_csv( 'list pos emoticons。 csv ') – Bullzeye

+0

私はパンダを使用していません。私は基本的なCSVを使用しています。編集。 –

関連する問題