2014-03-06 14 views
5

我有一個Unicode字符串,其開頭和結尾都有一些非空白空格。當使用strip()strip(string.whitespace)時,我會得到不同的結果。strip()和strip(string.whitespace)給出了不同的結果,儘管文檔提示它們應該是相同的

>>> import string 
>>> s5 = u'\xa0\xa0hello\xa0\xa0' 
>>> print s5.strip() 
hello 
>>> print s5.strip(string.whitespace) 
  hello   

strip()文檔說,「如果省略或None,所述chars參數默認爲刪除空白」。 string.whitespace的文檔稱「包含所有被認爲是空白的字符的字符串」。

因此,如果string.whitespace包含所有被認爲是空白的字符,那麼爲什麼結果會不同呢?它與Unicode有什麼關係?

我使用Python 2.7.6

+1

'string.whitespace'在我的Python 3.2.3上是''\ t \ n \ r \ x0b \ x0c「'。顯然Unicode不在圖片中。 –

+0

但是,文檔並沒有說'unicode.strip'使用'string.whitespace'來定義什麼是和不是空白。我相信'string'模塊的大部分已被棄用,已被摺疊到'str'類中。 – chepner

+1

@chepner除了常量,模板,格式化程序和maketrans - y ...幾乎所有的課上現在 –

回答

8

string.whitespace的文檔:

包含所有ASCII字符被認爲 空白字符串。這包括字符空間,製表符,換行符,回車符,換頁符和垂直製表符。

在python3下它是一樣的,其中刪除了所有非ASCII常量。 (在python2中,一些常量可能會受到locale設置的影響)。

因此,在行爲的差異還是比較明顯的,因爲strip()刪除任何的Unicode空白,而strip(string.whitespace)只刪除ASCII空格。你的字符串顯然包含非ASCII空格。

+0

嗯,有趣。來自Python 3.1的文檔(您發佈的鏈接)確實會說「ASCII字符」。來自Python 2.7的關於[string.whitespace](http://docs.python.org/2/library/string.html#string.whitespace)的文檔沒有具體說「ASCII字符」。我想知道Python 2.7是否有所不同,或者文檔是否只是缺少這兩個詞。 –

+0

@Beccacodes正如我在python2中所說的那些「常量」實際上取決於語言環境設置。在python3中,這是不正確的。請注意'locale'!= unicode。在python3中,他們決定擺脫這種「locale」相關行爲,只保留ASCII變體。我不知道他們爲什麼沒有將名稱更改爲'ascii_whitespace'。還要注意,python2中的'string.whitespace'是一個* byte *字符串,它應該已經告訴你它不能*包含所有的unicode空格字符。 – Bakuriu

+0

我還沒有使用unicode,所以我有點麻煩理解。它聽起來像你說的那樣,在Python 2.7中,string.whitespace _could_包含一些基於區域設置的非ASCII字符。但這聽起來像是''xa0''這個角色仍然不是一個可能的候選人。爲什麼? –

相關問題