Python Regex - 在Expresso中工作而不是在IronPython中

时间:2011-01-11 12:16:31

标签: python regex ironpython

回到我已发布的相同HTML内容。试着学习一点RegEx,即使我知道还有其他方法。我不是傻瓜,就像挑战一样......

我的表达是:

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>

如果我在Expresso中测试它,工作正常,但是当我在Python中运行时,我的结果是没有立即为组1 ...

有任何线索吗?

谢谢,

中号

2 个答案:

答案 0 :(得分:2)

  1. regexp的所有实现都有细微差别。它在expresso中工作并不意味着它在Python中有效。它也可能是一个有不同标志默认值的问题,比如空格等等。

  2. 除非案例很简单,否则请勿使用regexp来匹配HTML或XML。使用针对HTML / XML制作的库,例如lxmlBeautifulSoup

  3. 你的正则表达式是巨大的,我只是想着弄清楚它的工作原理让我头疼。见2.

  4. 执行此操作时:\\>您创建一个反斜杠并且大于括号。正则表达式将此解释为文字括号。您需要三个反斜杠:\\\>或更好:使用原始字符串,即使用r''而不是''。

  5. 使用BeautifulSoup。真。

答案 1 :(得分: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')