2010-04-07 90 views
20

我在Python中遇到了一個非常基本的字符串問題(我弄不明白)。基本上,我想做到以下幾點:使用Python刪除字符串中的不間斷空格

'# read file into a string 
myString = file.read() 

'# Attempt to remove non breaking spaces 
myString = myString.replace("\u00A0"," ") 

'# however, when I print my string to output to console, I get: 
Foo **<C2><A0>** Bar 

我認爲「\ u00A0」是對Unicode非打破空間換碼,但顯然我沒有正確這樣做。關於我做錯什麼的想法?

+2

您正在使用哪種版本的Python(答案可能因您使用的是2.x還是3.x而有所不同)? – 2010-04-07 18:16:58

+0

嗨凱西,是的,我使用Python v2.5.1 – dontsaythekidsname 2010-04-07 18:41:40

+0

編輯我的答案作出迴應。 – 2010-04-07 19:32:30

回答

0

沒有跡象表明你寫的東西你必然做錯了什麼:如果原始字符串在'Foo'和'Bar'之間有一個不間斷的空間,那麼現在你有一個正常的空間。這假定在某些時候你已經解碼了你的輸入字符串(我想象的是一個字節串,除非你在Python 3上,或者用codecs模塊中的函數打開了file)變成一個Unicode字符串,否則你不太可能在非Unicode字節字符串中定位unicode字符,用於replace的目的。但是,仍然沒有明確的跡象表明你寫的內容存在問題。

你能澄清什麼是輸入(打印repr(myString)替換之前),什麼是輸出(只後再次打印repr(myString)替換),以及爲什麼你認爲這是一個問題嗎?沒有repr,實際上不同的字符串可能看起來是一樣的,但repr在那裏有幫助。

4

不,u"\u00A0"是不間斷空格的轉義碼。 "\u00A0"是6個字符,不是任何類型的轉義碼。 Read this

+0

感謝您的鏈接Ignacio! – dontsaythekidsname 2010-04-07 18:43:45

+1

您提供的鏈接可能對初學者有好處,但它具有誤導性。它完全忽略了Unicode規範化,例如'''''u'\ u0107''它可以表示爲'u'c \ u0301'' http://unicode.org/reports/tr15/ – jfs 2010-04-07 20:32:18

34

您沒有unicode字符串,而是一個UTF-8字節列表(這是Python 2.x中的字符串)。

嘗試

myString = myString.replace("\xc2\xa0", " ") 

更好的將切換到Unicode - 看this article的想法。因此,你可以說

uniString = unicode(myString, "UTF-8") 
uniString = uniString.replace(u"\u00A0", " ") 

,它也應該工作(警告:我沒有現在的Python 2.x中可用的),但你需要將它迴轉換爲字節(二進制)將其發送到時一個文件或將其打印到屏幕上。

+1

您的解決方案是方式有用。謝謝! – Rokujolady 2012-10-30 18:26:00

+0

您的UTF-8解決方案正是我需要將不間斷空間放入日誌文件中的方法。雖然當記錄器將日誌記錄回顯到控制檯(不是UTF-8)時,輸出看起來很奇怪,當然,這看起來很奇怪,但它在日誌文件中變得完全不可見,導致它完全按照我的需要顯示,在我的列標籤上方有一個空行。 – 2018-01-24 18:48:24

0

請注意,簡單的myString.strip()不僅會刪除空格,還會從myString的開頭和結尾刪除非空格。不完全是OP所要求的,但在許多情況下仍然非常方便。