text="\xe2\x80\x94"
print re.sub(r'(\\(?<=\\)x[a-z0-9]{2})+',"replacement_text",text)
我怎麼可以處理十六進制字符小數在這種情況呢?
text="\xe2\x80\x94"
print re.sub(r'(\\(?<=\\)x[a-z0-9]{2})+',"replacement_text",text)
我怎麼可以處理十六進制字符小數在這種情況呢?
您的輸入不是有反斜槓。它有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編碼的字符,並且一起替換這些作爲一個羣體!
您的輸入是十六進制的,而不是實際的「\ xe2 \ x80 \ x94」。 \ x只是表示以下字符應該在十六進制中解釋的方式。
這在this post中有解釋。
您的輸入不包含*反斜槓。它有3個字節,即U + 2014 EM DASH的UTF-8編碼。 –
老兄,'text' **不是字面上的'\ xe2 \ x80 \ x94'。 '\ x'是一個特殊字符,它告訴Python後面的兩個字符將被解釋爲某些字符代碼的十六進制數字。 – freakish