2011-01-09 115 views
2

我知道正則表達式是不是刮HTMLS的最佳途徑,但是這是它... 我有一些類似:正則表達式 - 匹配可選組

<td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a> Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td> 

,我需要匹配的寫作藝術部分。但並不是說他們在那裏,並且可能有其他部分,如墨水和鉛筆...

我該如何做?我需要使用純正RegEx,不需要額外的Python庫。

+5

這不是「不是最好的方式」,它不是一種方式。如果我要求你用麪條釘釘子,那麼完成它的失敗是我的錯,而不是你的。 – msw 2011-01-09 04:41:55

+0

是的,沒錯。不會這樣做,如果我不會以某種方式被迫這樣做...除非你有一個關於如何閱讀一個HTML沒有額外的庫在Python的建議... – Maurizio 2011-01-10 11:15:46

+0

對不起,並不意味着聽起來刺耳。 ..我真的不需要閱讀所有的標籤,只是一些特定的標籤,所以我認爲這可以做到......我可能是錯的,儘管...謝謝! – Maurizio 2011-01-10 11:24:20

回答

0

儘管我以前的答案,我改變了主意,並希望不要有選項/備用,但得到他們。所以,這意味着無論是在TD標籤裏面的東西都必須被捕獲和適當的分類。 我需要創建一個可選的捕獲組,所以無論佈局如何,我仍然可以檢索內容。 應該有這方面的工作,即:

<td> Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td> 
<td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a> Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td> 
<td> Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Writing: <a href="creator.php?c=BKa">Bob Karp</a> Pencils: <a href="creator.php?c=AT">Al Taliaferro</a> Ink: <a href="creator.php?c=AH">Al Hubbard</a> </td>  
<td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td> 
<td> Writing: <a href="creator.php?c=VLo">Vic Lockman</a> Art: <a href="creator.php?c=KWr">Kay Wright</a> </td> 
<td> Writing: <a href="creator.php?c=MGa">Michele Gazzarri</a> Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td> 

我創建:

<td>\ {1,3}(?:(?:Writing: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>).*?)?(?:(?:Pencils: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>\))?(?:(?:Ink: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?(?:(?:Art: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?\ {1,3}</td> 

而且看起來它是工作!

我真的很感謝有人檢查和驗證我的努力。

0

你可以用正則表達式匹配可選的東西嗎?之後的可選部分。 ?將匹配0或1次子表達式。

1
regex = re.compile("(\w+):") 
regex.findall(yourString); // returns an array of matching elements 

您可以測試它here

PS:我強烈建議你去通過this

1

我創造了這個最後:

(Art:|Pencils:|Ink:|Writing:){0,4}.<a href="creator\.php\?c=[^">]*?\"\>(?P<Name>.*?)\</a\> 

,看起來像它的工作..也許它可以被打磨一下。我是你知道的首發。

2

也許有兩種模式可以識別。存在於

  1. 您的關鍵字< TD> ... </TD>
  2. 關鍵字後面是一個<> ... </A>部分

所以..第一內<提取一切TD>取值...(僞碼)

while (match("<td[^>]*>(.*?)</td[^>]*>")) { 
    inner = match[1]; 
    ... 
} 

(.*?)裝置匹配非貪婪地,即匹配最小可能。否則,你會匹配從第一個<td>最後</td>(而不是下一個</td>)的所有內容。

然後您可以繼續處理inner部分!