正则表达式 - 选择字符串直到'/'

时间:2014-08-01 19:50:38

标签: python regex python-2.7

我正在使用Regex来解析HTML(如果您正在阅读并执行此操作,我建议您改为使用HTMLParser)。

我的网页看起来像这样:

<div>&#1506;&#1489;&#1512; / Avr</div>
<div>&#1506;&#1489;/&#1512; / Av/r</div>

如何在&#34;之前选择部件? /&#34; (空间,斜线,空间)和之后的#34; /&#34;?换句话说,我怎样才能选择字符串直到&#34; /&#34;?

我希望它会返回一个如下所示的列表:

[("&#1506;&#1489;&#1512;", "Avr"),("&#1506;&#1489;/&#1512;", "Av/r")]

我知道我可以使用:

regex = re.compile('<div>(.+?)</div>').findall(resp)
resp = resp.split(' / ')

但我希望它可以使用正则表达式完成。

3 个答案:

答案 0 :(得分:3)

你可以尝试下面的python代码。

>>> import re
>>> s = """<div>&#1506;&#1489;&#1512; / Avr</div>
... <div>&#1506;&#1489;/&#1512; / Av/r</div>"""
>>> m = re.findall(r'^<div>(.*?) \/ ([^<]+)(?=<\/div>)', s, re.M)
>>> m
[('&#1506;&#1489;&#1512;', 'Avr'), ('&#1506;&#1489;/&#1512;', 'Av/r')]

答案 1 :(得分:1)

您可以使用非捕获组通过单个正则表达式获取所需的部分。

变化:

regex = re.compile('<div>(.+?)</div>').findall(resp)

为:

matches = re.compile('<div>(.+?)(?: / ).*?</div>').findall(resp)
print matches # ['&#1506;&#1489;&#1512;']

答案 2 :(得分:0)

尝试美味的汤,Jsoup或削皮器来减少这一点,但一旦你达到这个可能仍然有问题。

负面展望并展望未来将会成功。你只需要转义“/”,因为它是一个保留字符。

 re.search(".*?\/",html)

前瞻是(?&lt; = .....)

有关前瞻和后方的更多信息,请访问http://www.regular-expressions.info/lookaround.html

另外,Beautiful Soup有一个方法.prettify()和apache StringEscapeUtils可以转义XML和HTML,以便在Jsoup中更好地解析。 Python也可以用unicode编码evrything。如果您在那里遇到问题,还可以选择删除标签和编码。