2014-07-14 63 views
1

我是一個Python(和正則表達式)新手,在統計軟件包之外的編程經驗相對較少(SAS & Stata)。到目前爲止,我已經通過使用Python教程並解答了有關stackoverflow的其他問題,但我被卡住了。我在Mac OS X上運行Python 3.4。我的re.sub語句掛起了

我寫了一個腳本,下載和解析SEC文件。該腳本有四個主要步驟:

  1. 打開URL和內容裝載使用BeautifulSoup
  2. 刪除其他編碼與正則表達式語句的字符串變量
  3. 刪除HTML編碼(如JPG定義,嵌入式zip文件,等等)
  4. 保存生成的文本文件。

我的目標是在保存到我的本地驅動器之前從每個文件中刪除儘可能多的「非文本」信息。我寫了另一個腳本,在其中對剩餘文本進行實際分析。

我遇到了至少一個備案第3步的問題。引起該掛斷的行是:

_content1 = re.sub(r'(?i).*\.+(xls|xlsx|pdf|zip|jpg|gif|xml)+?[\d\D]+?(end)',r'',_content1) 

其中_content是包含SEC文件的內容的字符串變量。正則表達式應該用一個以文件擴展名(xls,pdf等)結尾的行開始,以「end」結尾。

上面的代碼在整個年度的申報工作中工作得很好(即我已經分析了2001年和2002年的所有問題),但是我的腳本在2013年被掛上了一個特定的申請(http://www.sec.gov/Archives/edgar/data/918160/0000918160-13-000024.txt)。我不確定如何調試,因爲我沒有收到任何錯誤消息。該腳本只是掛在這一行代碼上(我已經用前後的print語句驗證了這一點)。有趣的是,如果我用這個替換上面的代碼行:

_content1 = re.sub(r'(?i)begin*.*(xls|xlsx|pdf|zip|jpg|gif|xml)+?[\d\D]+?(end)',r'',_content1) 

然後一切工作正常。不幸的是,文件中的某些嵌入式文件不是以「開始」(如zip文件)開頭的,所以它不適用於我。

我希望有一位駐地專家可以在我的正則表達式替換語句中識別出會導致問題的事情,因爲通過連接的SEC文件進行逐匹配可能不可行(至少我不會這樣做)不知道從哪裏開始)。任何幫助是極大的讚賞。

感謝, JRM

編輯:

我能得到我的腳本中使用以下正則表達式的工作:

_content1 = re.sub(r'(?i)begin|\n+?.+?(xls|xlsx|pdf|zip|jpg|gif|xml)+?[\d\D]+?(end)',r'\n',_content1) 

這似乎是完成我想要的,但我我仍然很好奇,爲什麼如果有人有解決方案,原創不起作用。

回答

0

我認爲你最大的問題是缺乏錨點。你的原始正則表達式開始於.*,它可以開始匹配任何地方,並不會停止匹配,直到它到達換行符或文本的結尾。然後開始回溯,一次返回一個字符,嘗試匹配模式的第一個可證僞的組件:點和文件擴展名的字母。

所以它從文件的開頭開始,消耗可能有數千個字符,只有在放棄之前一直回溯到開頭。然後它會前進,並從第二個角色開始做同樣的事情。再從第三個角色,從第四個角度,依此類推。我知道它似乎令人難以置信的密集,但這是我們爲正則表達式的力量和緊湊性所做的權衡。

試試這個正則表達式:

r"(?im)^[^<>\n]+\.(?:xlsx?|pdf|zip|jpg|gif|xml)\n(?:(?!end$)\S+\n)+end\n" 

在多模式啓動錨(^)確保比賽才能開始在一行的開頭。我使用[^<>\n]+作爲該行的第一部分,因爲我正在處理鏈接的文件;如果您已經刪除了所有HTML和XML標記,則可以使用.+代替。

然後我使用(?:(?!end$).+\n)+來匹配一個或多個完全不完全由end組成的完整行。這可能比你的[\d\D]+?更有效率,但最重要的區別是,當我匹配end時,我知道它在線的開頭(並且$確保它在線的末尾)。

+0

雖然我將'[^ ,. \ n]'切換到'。+'就像你所建議的,因爲我已經去掉了所有的HTML標籤,這確實奏效。雖然這並不完美。出於某種原因,以「begin 644 a2012form10-k_chart.jpg」開頭的鏈接文件中的jpg塊不會被替換。所有其他人都這樣做。它似乎應該捕獲(並在pythex.org上測試正則表達式時)。但是,至少該文件會處理,所以我對解決方案感到滿意。謝謝! –

0

嘗試使用下面的正則表達式

_content1 = re.sub(r'(?i).*?\.+(xls|xlsx|pdf|zip|jpg|gif|xml)+?[\d\D]+?(end)',r'',_content1) 

我已經轉換您的*操作*?這是非貪婪的,這很可能是你想要的。

+0

我認爲我確實想要非貪婪的,但腳本仍然在您的編輯上掛上REGEX。不過謝謝! –