1. 程式人生 > 程式設計 >Python 字串處理特殊空格\xc2\xa0\t\n Non-breaking space

Python 字串處理特殊空格\xc2\xa0\t\n Non-breaking space

今天遇到一個問題,使用python的find函式尋找字串中的第一個空格時沒有找到正確的位置,例如:

http://zc.whmc.edu.cn ==> 無法訪問的網站或無效的招標網站

Python 字串處理特殊空格\xc2\xa0\t\n Non-breaking space

使用find(" ")函式尋找時找到的第一個空格對應在==>後面的那個位置。一開始覺得是編碼問題,但是檔案是用UTF-8編碼的,按理說不應該產生編碼問題,就用Sublime開啟一看是這樣的:

可以看到,我的Sublime設定了顯示空白,所以第二個紅線上方有一個白點,而第一個紅線上方卻沒有,這說明第一個紅線上方那個字元確實不是一個空格,也就是說函式的執行沒有問題。但那個空格倒底是個什麼東西呢?在Sublime中File-->Reopen with Encoding-->Hexadecimal開啟檔案可以看到是這樣的:

Python 字串處理特殊空格\xc2\xa0\t\n Non-breaking space

在網上可以查到,==>對應的UTF-8編碼是\x3d\x3d\x3e,所以前面的那個神祕字元的編碼就是\xc2\xa0,上網查到這是一個叫做Non-breaking space的東西,用於阻止在此處自動換行和阻止多個空格被壓縮成一個。至於解決方法,先用subplace("\xc2\xa0"," ")把這個特殊的空格替換一下就行了。

去除特殊空格:\xc2\xa0

在去除空格的時候遇到一種情況:

a = '2 '
b = '3'
print a.split(),b

輸出結果:

['2\xc2\xa0'] 3

在網上可以查到,==>對應的UTF-8編碼是\x3d\x3d\x3e,所以前面的那個神祕字元的編碼就是\xc2\xa0,上網查到這是一個叫做Non-breaking space的東西,用於阻止在此處自動換行和阻止多個空格被壓縮成一個。至於解決方法,先用subplace("\xc2\xa0"," ")

a = '2 '
b = '3'
 
print a.replace("\xc2\xa0",""),b

輸出結果:

Python 字串處理特殊空格\xc2\xa0\t\n Non-breaking space

python 爬蟲爬取內容時, \xa0 、 \u3000 的含義與處理方法

處理方法

str.replace(u'\xa0',u' ')

最近用 scrapy 爬某網站,發現拿到的內容裡面含有 \xa0 、 \u3000 這樣的字元,起初還以為是編碼不對,搜了一下才知道是見識太少 233 。

\xa0 是不間斷空白符

我們通常所用的空格是 \x20 ,是在標準ASCII可見字元 0x20~0x7e 範圍內。
而 \xa0 屬於 latin1 (ISO/IEC_8859-1)中的擴充套件字符集字元,代表空白符nbsp(non-breaking space)。

latin1 字符集向下相容 ASCII ( 0x20~0x7e )。通常我們見到的字元多數是 latin1 的,比如在 MySQL 資料庫中。

這裡也有一張簡陋的Latin1字符集對照表。

\u3000 是全形的空白符

根據Unicode編碼標準及其基本多語言面的定義, \u3000 屬於CJK字元的CJK標點符號區塊內,是空白字元之一。它的名字是 Ideographic Space ,有人譯作表意字空格、象形字空格等。顧名思義,就是全形的 CJK 空格。它跟 nbsp 不一樣,是可以被換行間斷的。常用於製造縮排, wiki 還說用於抬頭,但沒見過。

這裡還有一個 Unicode.org 上關於 CJK 標點符號塊的字元程式碼表。

python中去掉字串中的\xa0、\t、\n

今天幫女朋友從網路上收集一些資訊,但是發現提取出的資訊中有“\xa0”,並且無法去掉,查閱了相關資料,後發現該字元表示空格。

\xa0 是不間斷空白符
我們通常所用的空格是 \x20 ,是在標準ASCII可見字元 0x20~0x7e 範圍內。
而 \xa0 屬於 latin1 (ISO/IEC_8859-1)中的擴充套件字符集字元,代表空白符nbsp(non-breaking space)。
latin1 字符集向下相容 ASCII ( 0x20~0x7e )。通常我們見到的字元多數是 latin1 的,比如在 MySQL 資料庫中。
有如下資訊:

'T-shirt\xa0\xa0短袖圓領衫,體恤衫\xa0,','V-neck\xa0\xa0V型領\xa0sleeve\xa0\xa0袖子\xa0,

我們如何將其中的\xz0去掉呢,試了re模組的sub方法,發現沒有作用,於是又開始查閱相關資料,終於解決了該問題。方法如下:

>>> inputstring = u'\n           Door:\xa0Novum     \t   '
>>> move = dict.fromkeys((ord(c) for c in u"\xa0\n\t"))
>>> output = inputstring.translate(move)
>>> output
'           Door:Novum 

另外還有一種更簡單的方法,利用split方法:

>>> s
'T-shirt\xa0\xa0短袖圓領衫,體恤衫\xa0'
>>> out = "".join(s.split())
>>> out
'T-shirt短袖圓領衫,體恤衫'

可以發現利用translate方法、split()可以完美解決,並且還可以替換\t \n字元,由此又學到了新知識!

關於ord函式:
ord()函式是chr()函式(對於8位的ASCII字串)或unichr()函式(對於Unicode物件)的配對函式,它以一個字元(長度為1的字串)作為引數,返回對應的ASCII數值,或者Unicode數值,如果所給的Unicode字元超出了你的Python定義範圍,則會引發一個TypeError的異常。

關於fromkeys方法:
dict中的fromkeys方法目的是建立一個只有key的字典,內部利用for迴圈,使三個字元的asii碼值成為可迭代物件(本來的整數是不可迭代的),分別對其迭代,存入字典。

關於translate方法:
Python translate() 方法根據引數table給出的表(包含 256 個字元)轉換字串的字元,要過濾掉的字元放到 del 引數中。接收到move返回的表(字典),之後對字串進行替換。

join()方法:
join(): 連線字串陣列。將字串、元組、列表中的元素以指定的字元(分隔符)連線生成一個新的字串。可見該處用join方法真的是神來之筆,可謂絕妙!

值得注意的是,split方法中不帶引數時,表示分割所有換行符、製表符、空格。

python2 可以這樣

s=s.replace(unichr(0xa0),'')

到此這篇關於Python 字串處理特殊空格\xc2\xa0 Non-breaking space的文章就介紹到這了,更多相關Python 特殊空格內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!