2016-02-25 31 views
-1
text="\xe2\x80\x94" 
print re.sub(r'(\\(?<=\\)x[a-z0-9]{2})+',"replacement_text",text) 

輸出蟒蛇正則表達式:如何從字符串中刪除十六進制字符月

我怎麼可以處理十六進制字符小數在這種情況呢?

+1

您的輸入不包含*反斜槓。它有3個字節,即U + 2014 EM DASH的UTF-8編碼。 –

+1

老兄,'text' **不是字面上的'\ xe2 \ x80 \ x94'。 '\ x'是一個特殊字符,它告訴Python後面的兩個字符將被解釋爲某些字符代碼的十六進制數字。 – freakish

回答

2

您的輸入不是反斜槓。它有3個字節,UTF-8編碼的U+2014 EM DASH字符:

>>> text = "\xe2\x80\x94" 
>>> len(text) 
3 
>>> text[0] 
'\xe2' 
>>> text.decode('utf8') 
u'\u2014' 
>>> print text.decode('utf8') 
— 

你要麼需要從UTF-8直接那些UTF-8字節,或解碼匹配unicode並匹配碼點。後者是可取的;總是試圖將文本作爲Unicode來處理,以簡化一次需要轉換多少個字符。

另請注意,Python的repr()輸出(在交互式解釋器中回顯或打印列表,字典或其他容器時使用),使用\xhh轉義序列來表示任何不可打印的字符。對於UTF-8字符串,它包含ASCII範圍之外的任何內容。你可以只用更換任何範圍之外:

re.sub(r'[\x80-\xff]+', "replacement_text", text) 

考慮到,這將在一排匹配 UTF-8編碼的字符,並且一起替換這些作爲一個羣體!

0

您的輸入是十六進制的,而不是實際的「\ xe2 \ x80 \ x94」。 \ x只是表示以下字符應該在十六進制中解釋的方式。

這在this post中有解釋。

相關問題