2013-10-04 122 views
1

我正在嘗試編寫解析大型文本文件的代碼。但是,爲了獲得所述文本文件,我通過pdfminer運行原始PDF文件。雖然這個工作,它也返回了許多隨機的空間我的文本文件(見下文)刪除python中的空格

SM ITH , JO HN , PHD 
1234 S N O RT H AV E 

有沒有在Python沒有簡單的方法這樣的話是不分離的,只除去一定的空間?對於上面的示例,我希望它看起來像

SMITH, JOHN, PHD 
1234 S NORTH AVE 

謝謝。

+3

什麼是規則告訴你在'S'和'N'之間留一個空格,但刪除'N'和'O'之間的空格? – abarnert

+0

不,因爲要確定要刪除哪些空格來創建「單詞」的算法,它需要理解這些單詞。 PDF是圖像而不是基於字形的? –

回答

3

很可能你想要做的事情是不可能做到完美的,而且很難做得足夠好來滿足你。我會在下面解釋。

但是,有一個很好的機會,你不應該在一開始做。 pdfminer是高度可配置的,並且類似於只指定較小的-M值將首先給你想要的文本。你需要做一些試驗和錯誤,但是如果這樣做,它會比事後處理事情容易得多。


如果你想做到這一點,你需要拿出確定哪些空間是「隨機多餘的空格」,哪些是真正的空間,然後才能在Python代碼的規則。我不知道有這樣的規則。

在你的例子中,你可以處理大多數只需將多個空格變成單個空格,單個空格變成空白。應該很明顯如何做到這一點。即使你不能想到一個聰明的解決方案中,三取代正常工作:

s = re.sub(r'\s\s+', r'<space>', s) 
s = re.sub(r'\s', r'', s) 
s = re.sub(r'<space>', r' ', s) 

然而,這條規則是不完全正確的,因爲在JO HN , PHD,逗號後的空間不是隨機的額外空間,但它不會顯示爲兩個或更多的空間。 「1234 S」中的空間也一樣。而且,很可能,對於您的真實數據,在許多其他情況下也是如此。

一個不同的有點接近的規則是,你只能刪除字母之間的單個空格。再說一遍,如果可行,編碼很容易。例如:

s = re.sub(r'(\w)\s(\w)', r'\1\2', s) 

S =應用re.sub(R '\ S +',R」」,S)

但現在離開SMITHJOHN後的逗號之前的空間。

也許你需要投入約英文標點,帶一點點信息標點前後的空間,然後重新添加在空格的逗號或句號後,各地報價等

或者......好了,任何人,但你可以知道你的數據是什麼樣的,並弄清楚。


如果你不能拿出一個好的規則,唯一的選擇是建立一個圍繞在字典中查找可能的單詞和猜測哪一個更容易,這仍然不會得到一些啓發複雜一切都正確(例如,你怎麼知道「B OO KM AR K」是「BOOK MARK」還是「BOOKMARK」?),但這是你可能做到的最好的。

0

你想做的事情是不可能的,例如,「桌面頂部」應該是「桌面頂部」還是「桌面」?