Python正则表达式 - 在Expresso中有效但在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的结果立刻就是None...
有什么线索吗?
谢谢,
M
2 个回答
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')
2
所有的正则表达式实现都有一些细微的差别。在一个工具(比如expresso)上能用,并不代表在Python上也能用。可能是因为它们默认的设置不同,比如对空格的处理等等。
除非情况非常简单,否则不要用正则表达式来匹配HTML或XML。应该使用专门处理HTML/XML的库,比如lxml或者BeautifulSoup。
你的正则表达式太复杂了,光是想要理解它我就头疼。参考第二条。
当你这样写:
\\>
时,你实际上创建了一个反斜杠和一个大于号。正则表达式会把它当作一个字面意义上的符号。你需要写三个反斜杠:\\\>
,或者更好的是,使用原始字符串,也就是用r''而不是''。真的,使用BeautifulSoup。