2013-05-28 29 views
0

我將一個較舊的Python代碼移植到Python 3中。代碼在Python 2.7中工作。下面一行是創建一個不平衡的括號錯誤:重新編譯的不平衡括號錯誤

pp = re.compile('\\\([^\\<\/td\ *\>\([^\<]*)\<\/td\ *\>\[^\<]*\<\/td\ *\>\([^\<]*)\<\/td\ *\>\([^\<]*)\<\/td\ *\>\([^\<]*)\<\/td\ *\>\<\/tr\ *\>') 

我不知道如何解決這個問題。任何建議將不勝感激如何打破這一點,並找出答案。

+3

神聖太多的反斜槓,蝙蝠俠!使用'r'''原始字符串來減少所有這些。 '/'不需要轉義。 –

+0

而且代碼對我來說並不適用於Python 2.7。 –

+3

哦,也許你想用一個HTML解析器呢?我懷疑你的代碼會比BeautifulSoup簡單得多。 –

回答

0

你的表情幾乎是不可讀的,而且大部分\反斜槓實際上是沒有意義的。那些確實有意義的是\[,\(\)組合,其中大多數看起來像他們不應該在那裏在所有

例如。部分\[^\<]被破壞,因爲逃逸的\[使得]括號不平衡。

刪除所有反斜線使碼編譯:

>>> re.compile('([^</td *>([^<]*)</td *>[^<]*</td *>([^<]*)</td *>([^<]*)</td *>([^<]*)</td *></tr *>') 
<_sre.SRE_Pattern object at 0x7f8c61c76d50> 

不是該模式使得在這種情況下,更多的意義,因爲在開始標誌着一個開放字符類[^那裏,但人物那跟着它表明那不是那個意圖,我們早期看到的\[可能是那個類的一部分,但是然後你會匹配任何不在集合{'<', '/', 't', 'd', ' ', '*', '(', '[', '^', '<'}中的東西,這可能不是你想要的。

簡而言之,整個表達式被嚴重破壞,並且在任何Python版本中都不會以當前形式工作。

它看起來像你正試圖用正則表達式解析HTML。這不會很好。改爲使用合適的HTML解析器,例如BeautifulSoup將使提取表格單元數據的任務變得更簡單。

+0

感謝您的指導。你是對的。新代碼確實會編譯。爲了澄清,這是我繼承的舊代碼,並被告知它運行正常。我的錯誤:我應該首先自己運行它來驗證。我實際上有4行這種類型的代碼。我會嘗試根據你的建議自行解決它。順便說一句,爲什麼有人會這樣編碼?我也會看看BeautifulSoup。謝謝。 – PBrenek

+0

看起來有人從某處複製和粘貼正則表達式而不理解它的功能;甚至可能來自Perl或JavaScript的意思。我無法想象任何人寫這些,並理解他們在做什麼。 –

+0

謝謝你的澄清。我會嘗試一下,並且繼續努力。我也會看看BeautifulSoup。再一次,非常感謝你。 – PBrenek