正则表达式从字符串中提取和排除数据

时间:2013-04-05 15:52:42

标签: python regex

我有一个类似html的字符串,我想从中提取数据。

s="<ul><li>this is a bullet lev 1&nbsp;</li><li><ul><li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li></ul></li><li>&nbsp;<ul><li><ul><li>this is a bullet lev 3</li></ul></li></ul></li></ul></ul><strong></li>

我想提取包含&lt; li&gt;的所有数据的内容元素,这些元素包含它们之间的“这是一个子弹列1”,而不是包含其他&lt; li&gt;的元素。如多层元素,如

<li><ul><li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li></ul></li>

我为那个

写了一个正则表达式
<li>([\w &;/<>]*?)</li>

然而,这最终也会拉出不需要的数据

<li>this is a bullet lev 1&nbsp;</li>
<li><ul><li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li>
<li>&nbsp;<ul><li><ul><li>this is a bullet lev 3</li>

虽然我想拉它

<li>this is a bullet lev 1&nbsp;</li>
<li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li>
<li>&nbsp;<ul><li><ul><li>this is a bullet lev 3</li>

我的想法是,我要排除已有的任何结果&lt; li&gt;在提取的数据中继续前进。

从研究中我了解到,我可能不得不使用前瞻或后视,我给了它几次尝试但无济于事。

任何线索?我正在使用python,它内置了模块。

2 个答案:

答案 0 :(得分:0)

我之前从未使用过BeautifulSoup,但我在15分钟内安装了它并且没有阅读任何文档:

>>> s="<ul><li>this is a bullet lev 1&nbsp;</li><li><ul><li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li></ul></li><li>&nbsp;<ul><li><ul><li>this is a bullet lev 3</li></ul></li></ul></li></ul></ul><strong></li>"
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup(s)
>>> for liRaw in soup.findAll('li'):
...   if liRaw.findParent().findParent().name == u'[document]':
...     print liRaw.text
this is a bullet lev 1&nbsp;
&nbsp;thisis a bullet lev&nbsp;
&nbsp;this is a bullet lev 3

希望这会有所帮助......

答案 1 :(得分:0)

我认为这可能会起作用。

<li>((?!<li>).)*?</li>

任何<li>后跟</li>以及介于两者之间的任何内容,只要它们不包含<li>(使用lookahead

这假设您实际上并不想要<li>&nbsp;<ul><li><ul><li>this is a bullet lev 3</li>,而是在示例中使用<li>this is a bullet lev 3</li>,这似乎与您的描述更为一致。

那就是说,一般来说,解析器对于这类事情确实是个更好的主意。