我正在尝试在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
如果在
中搜索em_test'这是一个测试字符串'
我实际上可以找到它。
所以我制作了一个csv文件,其中包含我想用unicode定义的所有表情符号。 CSV看起来像这样:
\ U0001F600
\ U0001F601
\ U0001F602
\ U0001F923
当我导入并打印它时,我不会获得表情符号而只是文本表示:
['\\U0001F600',
'\\U0001F601',
'\\U0001F602',
'\\U0001F923',
...
]
因此我不能用它在另一个字符串中搜索这些表情符号... 我不知何故知道双反斜杠\只是单斜杠的表示,但不知何故unicode阅读器没有得到它......我不知道我错过了什么。
有什么建议吗?
答案 0 :(得分:2)
您可以使用.decode('unicode-escape')
解码这些Unicode转义序列。但是,.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)
<强>输出强>
\U0001F600 GRINNING FACE
\U0001F601 GRINNING FACE WITH SMILING EYES
\U0001F602 FACE WITH TEARS OF JOY
\U0001F923 ROLLING ON THE FLOOR LAUGHING
这应该比使用ast.literal_eval
快得多。如果您以二进制模式读取数据,它将更快,因为它在读取文件时避免了初始解码步骤,并允许您消除.encode('ASCII')
调用。
使用
可以使解码更加健壮u.encode('Latin1').decode('unicode-escape')
但这对您的表情符号数据来说不是必需的。正如我之前所说,如果以二进制模式打开文件以避免编码它会更好。
答案 1 :(得分:1)
<强> 1。保持你的csv原样:
这是一个臃肿的解决方案,但使用ast.literal_eval
有效:
import ast
s = '\\U0001F600'
x = ast.literal_eval('"{}"'.format(s))
print(hex(ord(x)))
print(x)
我得到0x1f600
(这是正确的字符代码)和一些表情字符()。 (好吧,我必须将一个奇怪的字符从我的控制台复制/粘贴到这个答案文本字段,但这是我最终的控制台问题,否则可行)
只是用引号括起来允许ast
将输入作为字符串。
<强> 2。直接使用字符代码
也许你最好通过存储字符代码而不是\U
格式:
print(chr(0x1F600))
完全相同(所以ast
稍微有点过分)
你的csv可能包含:
0x1F600
0x1F601
0x1F602
0x1F923
然后chr(int(row[0],16))
会在阅读时解决问题:例如,如果CSV(或第一行)中有一行
with open("codes.csv") as f:
cr = csv.reader(f)
codes = [int(row[0],16) for row in cr]