2016-07-31 59 views
2

我想用''替換所有表情符號,但我的regEx不起作用。
例如,python-re.sub()和unicode

content= u'?\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633?' 

,我想,以取代所有的格式,如:\U0001f633''所以我寫的代碼:

print re.sub(ur'\\U[0-9a-fA-F]{8}','',content)

但它不工作。
非常感謝。

回答

3

您將無法識別正確解碼的unicode碼點(包含\uXXXX等的字符串)。正確解碼,到正則表達式解析器到達它們時,每個碼都是*字符。

根據您的蟒蛇是否只有16位的Unicode碼點或沒有編譯,你會想要一個模式類似之一:

# 16-bit codepoints 
re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 

# 32-bit* codepoints 
re_strip = re.compile(u'[\U00010000-\U0010FFFF]') 

而且你的代碼看起來像:

import re 

# Pick a pattern, adjust as necessary 
#re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 
re_strip = re.compile(u'[\U00010000-\U0010FFFF]') 

content= u'[\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633]' 
print(content) 

stripped = re_strip.sub('', content) 
print(stripped) 

兩個表達式,在stripped字符串中的字符的數量減少到26

這些表達式剔除你後的表情符號,BU t也可以去掉其他東西想要的。值得查看一個unicode代碼點範圍列表(例如here)並對其進行調整。

你可以決定你是否蟒安裝只能通過執行類似識別16位碼點:

import sys 
print(sys.maxunicode.bit_length()) 

如果這顯示16,你需要第一個正則表達式。如果它顯示的東西大於16(對我來說它說21),第二個是你想要的。

這兩個表達式在Python安裝時使用錯誤的sys.maxunicode都不起作用。

另請參閱:this相關。

+0

非常感謝。有用。但是你說它可能會剝奪我想要的其他東西。那麼,如果我只想刪除表情符號呢?內容可能包含漢字,數字,字母,標點和表情符號。順便說一句,我的python只編譯了16位unicode代碼點。 – sophiaCY

+0

嗯,它*可能*。我「過濾」出的代碼點從10000開始(這裏是http://jrgraphix.net/research/unicode_blocks.php)。因此,「線性B音節」到「標籤」中的任何內容。根據我的經驗,大多數字體甚至沒有這些代碼點的字形。所以,你所要做的任何事情都不太可能在這個範圍內,所以過濾可能很好,但這只是一些需要注意的事情。 – jedwards