正规表达式提取和排除字符串中的数据

2024-04-18 17:59:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似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>

““

我想提取包含<;li>;元素的所有数据的内容,这些元素之间包含类似“this is a bullet lev 1”的元素,而不是包含其他元素的元素,如

^{pr2}$

我为此写了一个正则表达式

<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>

我的想法是,我希望排除提取数据中已经包含的任何结果,然后继续前进。在

根据我的研究,我知道我可能要用“向前看”或“向后看”,我试了几次,但都没用。在

有什么线索吗?我正在使用python和它内置的re模块。在


Tags: 数据字符串ltgt元素内容ishtml
2条回答

我想这也许能解决问题。在

<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>,这似乎更符合您的描述。在

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

我以前从未使用过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

希望这能帮助。。。在

相关问题 更多 >