2012-03-23 58 views
0

我在抓取YouTube播放列表頁面時遇到了一些正則表達式代碼。它主要工作正常,但它撿了幾個奇怪的結果正則表達式問題 - 刮YouTube

表達:

(?<=v=)[a-zA-Z0-9-_]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+ 

的東西挑出來的例子:

yXBckFyiMyU, 
opWYnUpNtG8, 
YFbLRZCExBk, 
I_GZahAl-PQ, 
G6F_iP-F7Fw 

這樣從

https://www.youtube.com/watch?v=_ClmClS_Mqs&list=PL6422619E56951B73&index=5&feature=plpp_video 
鏈接

在大多數情況下,這似乎工作正常,但它也正在挑選這些實例

data-thumb="//i1.ytimg.com/vi/84GVRtJ1CvY/<FROM RIGHT ONWARDS IS WHAT IT MATCHES>default.jpg" ><span class="vertical-align"></span></span></span></span> 

data-thumb="//i4.ytimg.com/vi/WNIPqafd4As/<FROM RIGHT ONWARDS IS WHAT IT MATCHES>default.jpg" alt="" class="thumb"></span></span></span><span class="clip"><span class="centering-offset"><span class="centering"><span class="ie7-vertical-align-hack"> 

正則表達式是相當艱鉅的。有人知道表達有什麼問題嗎?

+0

你有沒有使用一些HTML解析器來創建元素樹考慮,然後只適用於正則表達式中的鏈接在那棵樹上? [這裏](http://stackoverflow.com/a/1732454/960195)是一個幽默的意見,解析HTML與正則表達式與專用解析器。 – 2012-03-23 01:38:30

+0

@Adam:我們不是試圖解析任意的HTML - 只是URL。 Cthulu /託尼小馬不會消耗你的靈魂*嘗試*與正則表達式做到這一點。 (儘管如此,仍然建議使用正確的HTML和URL解析庫。) – 2012-03-23 01:42:51

回答

4

作爲一個建議,你想匹配的字符串總是11個字符長。而不是嘗試使用+量詞匹配「儘可能多的字符」,而是使用{11}量詞匹配「正好11個字符」。

這可能會治好您看到的過度匹配問題的症狀,儘管我不知道爲什麼它首先匹配那些字符串。 (他們不v=啓動。)

你或許應該由parenthesising澄清你的交替|

((?<=v=)[a-zA-Z0-9-_]+(?=&))|((?<=[0-9]/)[^&\n]+)|((?<=v=)[^&\n]+) 

,如果您正則表達式的味道支持詳細的正則表達式(評論中的正則表達式)使用它們!


作爲一個建議 - 解析URL與正則表達式是討厭。我反而:

  • 得到使用HTML解析器頁面上的所有URL列表
  • 分析每個URL(在Python我會用BeautifulSoup,這使得它很容易得到「所有鏈接」。)使用parse_url()(更多Python),獲取GET屬性的字典/散列。例如:

字典可能看起來像

{ 
'v' : '_ClmClS_Mqs', 
'list' : 'PL6422619E56951B73', 
'index' : '5' 
'feature' : 'plpp_video', 
} 

然後,你可以索要GET屬性v。不需要正則表達式。

這是python特有的,但Java會有等價物。問題的關鍵是,正則表達式並不總是最佳工具(只是最一般工具)。

+0

+1可以得到很好的答案,如果可以的話,我會添加另一個+1「正則表達式並不總是最好的*工具(只是最常用的工具)「 – 2012-03-23 01:44:47

+0

謝謝你的幫助。我計劃在未來進行更多的挖掘,但是我幾乎已經完成了整個項目,所以我暫時還要繼續使用正則表達式。你的建議幾乎解決了這個問題,只能想到它現在正在拾取'。你知道爲什麼嗎? – CitizenSmif 2012-03-23 01:53:15

+0

諷刺的答案是「你的正則表達式不夠具體」。 ;)更嚴重的是,你的正則表達式真的是三個正則表達式中的一個 - 你可以試着將它們分開來看看三個子正則表達式中哪一個產生了錯誤的匹配? (通過分治來調試) – 2012-03-23 01:56:39