Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将表情符号替换为其描述或名称_Python_Regex_Python 3.x_Unicode - Fatal编程技术网

Python 将表情符号替换为其描述或名称

Python 将表情符号替换为其描述或名称,python,regex,python-3.x,unicode,Python,Regex,Python 3.x,Unicode,我正在从API检索的文本中获取表情符号的子集。我想做的是用每个表情符号替换其描述或名称 我正在使用Python 3.4,目前的做法是将unicode的名称与unicode数据相匹配,如下所示: nname = unicodedata.name(my_unicode) 我用re.sub替换: re.sub('[\U0001F602-\U0001F64F]', 'new string', str(orig_string)) 我尝试过重新搜索,然后访问匹配项并替换字符串(不适用于正则表达式),但未

我正在从API检索的文本中获取表情符号的子集。我想做的是用每个表情符号替换其描述或名称

我正在使用Python 3.4,目前的做法是将unicode的名称与unicode数据相匹配,如下所示:

nname = unicodedata.name(my_unicode)
我用re.sub替换:

re.sub('[\U0001F602-\U0001F64F]', 'new string', str(orig_string))
我尝试过重新搜索,然后访问匹配项并替换字符串(不适用于正则表达式),但未能解决此问题


是否有一种方法可以为re.sub执行的每个替换获取回调?任何其他路线也值得推荐。

不太干净,但可以:

import unicodedata

my_text ="\U0001F602  and all of this \U0001F605"

for char in range(ord("\U0001F602"),ord("\U0001F64F")):
    my_text=my_text.replace(chr(char),unicodedata.name(chr(char),"NOTHING")) 

print(my_text)

结果:脸上挂着喜悦的泪水,脸上挂着张开的嘴和冷汗的笑容

您可以通过文档将回调函数传递给:

re.sub(模式、应答、字符串、计数=0、标志=0)

返回通过替换repl替换字符串中模式最左侧不重叠的出现而获得的字符串。如果找不到模式,则返回的字符串将保持不变。repl可以是字符串或函数;[…]如果repl是一个函数,则会为模式的每个非重叠出现调用它函数接受单个匹配对象参数,并返回替换字符串

因此,只需使用
unicodedata.name
作为回调:

>>> my_text ="\U0001F602  and all of this \U0001F605"
>>> re.sub('[\U0001F602-\U0001F64F]', lambda m: unicodedata.name(m.group()), my_text)
'FACE WITH TEARS OF JOY  and all of this SMILING FACE WITH OPEN MOUTH AND COLD SWEAT'

可以将函数作为的repl参数传入

它被传递匹配对象并返回您想要吐出的内容:

input = 'I am \U0001F604 and not \U0001F613'
re.sub('[\U0001F602-\U0001F64F]', lambda y: unicodedata.name(y.group(0)), input)
# Outputs:
# 'I am SMILING FACE WITH OPEN MOUTH AND SMILING EYES and not FACE WITH COLD SWEAT'

在Python 3.5+中,有
nameplace
错误处理程序。您可以使用它一次转换多个表情符号:

>>> import re
>>> my_text ="\U0001F601, \U0001F602, ♥ and all of this \U0001F605"
>>> re.sub('[\U0001F601-\U0001F64F]+',
...        lambda m: m.group().encode('ascii', 'namereplace').decode(), my_text)
'\\N{GRINNING FACE WITH SMILING EYES}, \\N{FACE WITH TEARS OF JOY}, ♥ and all of this \\N{SMILING FACE WITH OPEN MOUTH AND COLD SWEAT}'

例如,.

为什么不使用替换?“\U0001F602和其他文本”。替换(“\U0001F602”,“微笑”)?使用
re.U
标志怎么样
re.sub('[\U0001F602-\U0001F64F],'new string',str(orig_string),re.U)
lemonhead和tobias_k的答案都非常有效,而且是一种非常优雅高效的方法。非常感谢。接受这个答案是因为屏幕上有更多的文档,这可能会为其他成员提供更快的参考。谢谢,我会在3.5迁移时记住这一点。我也同意,emojis比regex模式显示的要多得多。因此,对于对正则表达式模式感兴趣的人来说,这只是一个子集。