如何在python中获取正确的unicode字符列表

Bul*_*eye 5 python string unicode emoticons

我试图在python字符串中搜索表情符号.所以我有,例如,

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
Run Code Online (Sandbox Code Playgroud)

如果在中搜索em_test

'这是一个测试字符串'

我实际上可以找到它.

所以我制作了一个csv文件,其中包含我想用unicode定义的所有表情符号.CSV看起来像这样:

\ U0001F600

\ U0001F601

\ U0001F602

\ U0001F923

当我导入并打印它时,我不会获得表情符号,而只是文本表示:

['\\U0001F600',
 '\\U0001F601',
 '\\U0001F602',
 '\\U0001F923',
...
]
Run Code Online (Sandbox Code Playgroud)

因此我不能用它在另一个字符串中搜索这些表情符号...我知道双反斜杠\只表示单斜杠但不知何故unicode读者不能得到它...我不知道我是什么我失踪了.

有什么建议?

PM *_*ing 3

您可以使用 解码这些 Unicode 转义序列.decode('unicode-escape')。但是,.decode是一种bytes方法,因此如果这些序列是文本而不是字节,您首先需要将它们编码为字节。或者,您(可能)可以以二进制模式打开 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)
Run Code Online (Sandbox Code Playgroud)

输出

\U0001F600 GRINNING FACE 
\U0001F601 GRINNING FACE WITH SMILING EYES 
\U0001F602 FACE WITH TEARS OF JOY 
\U0001F923 ROLLING ON THE FLOOR LAUGHING 
Run Code Online (Sandbox Code Playgroud)

这应该比使用ast.literal_eval. 如果您以二进制模式读取数据,速度会更快,因为它避免了读取文件时的初始解码步骤,并且允许您消除调用.encode('ASCII')

您可以使用以下方法使解码更加稳健

u.encode('Latin1').decode('unicode-escape')
Run Code Online (Sandbox Code Playgroud)

但这对于您的表情符号数据来说不是必需的。正如我之前所说,如果以二进制模式打开文件以避免对其进行编码,那就更好了。