2011-01-11 79 views
0

回到我已發佈的HTML事物。試圖學習一點正則表達式,即使我知道還有其他方法。我不是啞巴,只是喜歡挑戰......Python正則表達式 - 在ExpressO不在IronPython中工作

我的表達是:

publisher.php\?c=.*?\">(.*?)</a>(?:.*?)<br\s\\>(?:[\s\r\n]*?)Date:\s<time\sdatetime="(.*?)\">(?:.*?)(?:[\s\r\n]*?)Pages:\s*?(\d*?)<br\s\\> 

要匹配的東西:

<p>Country: <a href="country.php?c=it">Italy</a><br \> 
      Publication: <a href="publication.php?c=it/TL">Topolino (libretto)</a></p> 
       Publisher: <a href="publisher.php?c=Mondadori">Mondadori</a><br><br \> 
        Date: <time datetime="1970-11-22">November 22, 1970</time><br \> 
        Pages: 196<br \> 

        Price: 150 Lit. <br \> 
        <span class="indexedBy">Index delivered by: <a href="mag-inx.php?c=ABo">ABo</a></span> 

如果我在快報測試,工作正常,但當我在Python中運行它,我的結果是沒有立即爲組1 ...

任何線索?

感謝,

中號

+3

你爲什麼要用正則表達式處理HTML? – Tomalak 2011-01-11 12:21:31

+0

學習?在我的腦海中,最好的方式來獲得Python和RegEx?因爲大家都說不要這樣做? :-) – Maurizio 2011-01-11 12:58:45

+0

我已經更新了我的答案。 – 2011-01-11 13:10:48

回答

2
  1. 的正則表達式有細微的差別所有的實現。它在expresso中工作並不意味着它在Python中起作用。它也可能是一個不同的標誌默認值的問題,如空白等。

  2. 不要使用正則表達式來匹配HTML或XML,除非情況微不足道。使用爲HTML/XML製作的庫,如lxmlBeautifulSoup

  3. 你的正則表達式是巨大的,從我只是想試圖找出它的工作原理就頭疼。請參閱第2

  4. 當你這樣做:\\>創建一個反斜槓和一個比支架大。正則表達式會將其解釋爲文字括號。您需要三個反斜槓:\\\>或更好:使用原始字符串,即使用r''而不是''。

  5. 使用BeautifulSoup。真。

0

你如何在Python中運行它?你是否將它作爲原始字符串轉義出來?你添加了多行標誌嗎?

您正在以可能導致問題的方式混合雙引號,單引號和反斜槓。例如,這個位看起來很奇怪:

c=.*?\"> 

但是它在Linux x86上似乎適用於Python 2.6.6。

$ cat expresso.py 
import re 

str = r'''<p>Country: <a href="country.php?c=it">Italy</a><br \> 
      Publication: <a href="publication.php?c=it/TL">Topolino (libretto)</a></p> 
       Publisher: <a href="publisher.php?c=Mondadori">Mondadori</a><br><br \> 
        Date: <time datetime="1970-11-22">November 22, 1970</time><br \> 
        Pages: 196<br \> 

        Price: 150 Lit. <br \> 
        <span class="indexedBy">Index delivered by: <a href="mag-inx.php?c=ABo">ABo</a></span>''' 

pat = r'publisher.php\?c=.*?\">(.*?)</a>(?:.*?)<br\s\\>(?:[\s\r\n]*?)Date:\s<time\sdatetime="(.*?)\">(?:.*?)(?:[\s\r\n]*?)Pages:\s*?(\d*?)<br\s\\>' 
res = re.search(pat, str, re.MULTILINE) 
print res.groups() 

$ python expresso.py 
('Mondadori', '1970-11-22', '196')