2017-05-21 66 views
2

我試圖從其他字符/單詞/表情符號中給定文本中分隔表情符號。我希望稍後將表情符號用作文本分類中的功能。所以重要的是我將每個表情符號單獨作爲一個獨立的角色對待。Python表情符號搜索和替換不能按預期方式工作

代碼:

import re 

text = "I am very #happy man but my wife is not " 
print(text) #line a 

reg = re.compile(u'[' 
    u'\U0001F300-\U0001F64F' 
    u'\U0001F680-\U0001F6FF' 
    u'\u2600-\u26FF\u2700-\u27BF]+', 
    re.UNICODE) 

#padding the emoji with space at both the ends 
new_text = reg.sub(' \1 ',text) 
print(new_text) #line b 

# this is just to test if it can still identify the emoji in new_text 
new_text2 = reg.sub('#\1#', new_text) 
print(new_text2) # line c 

下面是實際的輸出:

enter image description here

(我不得不將此截圖粘貼,因爲拷貝從終端,在此貼輸出是扭曲那些已經扭曲的表情符號在線b和c)

這是我的預期輸出:

I am very #happy man but my wife is not 
I am very #happy man but  my wife is not  
I am very #happy man but ## ## my wife ## is not ## ## 

問題:

1)爲什麼如預期的查找和替換不工作?什麼是表情符號被替換? (b行)。這絕對不是原始表情符號的Unicode,否則c行會在兩端印上#表情符號。

2)我不確定我是否正確,但 - 爲什麼組合的表情符號被替換爲單個表情符號/ unicode? (b行)

+0

你想到這一點 - http://rextester.com/UXJ28002?我看到您的預期產出與解決最明顯問題後得到的結果不同。 –

+0

我期待每個表情符號分開。在預期的輸出中查看我的第二個問題和第三行。不知道爲什麼組合的表情符號沒有分開。 –

+0

我認爲這是因爲你量化了角色類,請參閱http://rextester.com/RXOBH48259。現在,它看起來像你的預期輸出。 –

回答

3

這裏有幾個問題。

  • 有一個在正則表達式模式沒有捕獲組,但在替換模式,您可以定義\1反向引用組1 - 所以,最自然的解決方法是使用一個反向引用0組,即整場比賽,那就是\g<0>
  • 替換時的\1實際上未被解析爲反向引用,而是作爲八進制值爲1的字符,因爲常規(非原始)字符串文字中的反斜槓形式爲轉義序列。在這裏,它是一個八進制轉義。
  • ]+意味着這樣你匹配序列的表情符號而非每個單獨表情符號正則表達式引擎必須在1個或多個文本匹配字符類的匹配。

使用

import re 

text = "I am very #happy man but my wife is not " 
print(text) #line a 

reg = re.compile(u'[' 
    u'\U0001F300-\U0001F64F' 
    u'\U0001F680-\U0001F6FF' 
    u'\u2600-\u26FF\u2700-\u27BF]', 
    re.UNICODE) 

#padding the emoji with space at both ends 
new_text = reg.sub(r' \g<0> ',text) 
print(new_text) #line b 

# this is just to test if it can still identify the emojis in new_text 
new_text2 = reg.sub(r'#\g<0>#', new_text) 
print(new_text2) # line c 

Python demo打印

I am very #happy man but my wife is not 
I am very #happy man but  my wife is not  
I am very #happy man but ## ## my wife ## is not ## ## 
+0

非常感謝。學到了新東西。 –

+1

很多人喜歡可讀性,所以你也可以用'('和')'包裝整個模式,然後使用你的'\ 1',但總是使用*原始字符串*,即'r' 1「'。 –

+0

絕對。再次感謝。正則表達式很複雜。我不知道我會不會掌握他們。 :) –

相關問題