2015-10-07 32 views
3

我正在從API中檢索到的文本中獲取表情符號的子集。我想要做的是替換每個表情符號的描述或名稱。用描述或名稱替換表情符號

我工作的Python 3.4和我目前的做法與unicodedata這樣accesing unicode的名字:

nname = unicodedata.name(my_unicode) 

我正與應用re.sub替換:

re.sub('[\U0001F602-\U0001F64F]', 'new string', str(orig_string)) 

我已經嘗試過re.search,然後訪問匹配並替換字符串(不能用於正則表達式),但一直無法解決這個問題。

有沒有一種方法可以爲每個re.sub所做的替換獲取回調?任何其他路線也表示讚賞。

+0

爲什麼不使用替換? 「\ U0001F602和其他文本」.replace(「\ U0001F602」,「微笑」)? –

+0

使用're.U'標誌怎麼樣? 're.sub('[\ U0001F602- \ U0001F64F]','新字符串',str(orig_string),re.U)' – Kasramvd

回答

2

面您可以傳遞一個回調函數re.sub:從文檔:

re.sub(pattern, repl, string, count=0, flags=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' 
+0

@lemonhead和tobias_k這兩個答案都非常好用,並且非常優雅高效。真的很感激它。接受這個答案是因爲屏幕上的附加文件可能證明對其他成員更快的參考。 –

0

不那麼幹淨,但工作原理:

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) 

結果:用喜悅的和張嘴淚洗面這個笑臉的冷汗

2

您可以在一個功能通過爲re.sub()

它是通過匹配對象的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' 
0

在Python 3中.5+,有namereplace錯誤處理程序。你可以用它來幾個表情立刻轉換:

>>> 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}' 

more Unicode characters that are emoji than the regex pattern indicates例如,♥ (U+2665 BLACK HEART SUIT)

+0

謝謝,我會記住3.5遷移。我也同意有更多的emojis比正則表達式模式表明。所以對於那些對正則表達式感興趣的人來說,這只是一個子集。 –