多次匹配括号内的文本

时间:2019-03-20 20:54:18

标签: python regex

假设我有这样的文字:

<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>

我想使用一个正则表达式使用python提取<li> / list标记之间的所有文本。

regexp = <p>.+?(<li>.+?</li>).+?</p>

这仅返回列表中由<li> / list标记包围的第一项:

<li>pizza</li>

有没有办法让我抓取<li> / list标记之间的所有项目,使我的输出看起来像:

<li>pizza</li><li>burgers</li><li>fries</li>

4 个答案:

答案 0 :(得分:4)

这应该有效:

import re

source = '<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>'
res = ''.join(re.findall('<li>[^<]*</li>', source))
# <li>pizza</li><li>burgers</li><li>fries</li>

答案 1 :(得分:2)

假设您已经提取了陈述的示例字符串,您可以执行以下操作:

import re
s = "<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>"
re.findall("<li>.+?</li>", s)

Output:
['<li>pizza</li>', '<li>burgers</li>', '<li>fries</li>']

答案 2 :(得分:1)

为什么需要<p>标签?

import re

source = '<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>'

m = re.findall('(<li>.+?</li>)',source)
print m

返回想要的东西。

修改

如果只需要<p>标记之间的文本,则可以分两个步骤进行操作:

import re

source = '<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p> and also <li>coke</li>'

ss = re.findall('<p>(.+?)</p>',source)

for s in ss:
    m = re.findall('(<li>.+?</li>)',s)
    print m

答案 3 :(得分:0)

使用re.findall()尝试此正则表达式

要获取文字:<li>([^<]*)</li>,要获取标签:<li>[^<]*</li>

>>> import re
>>> s = "<p>Joe likes <ul><li>pizza</li>, <li>burgers</li>, and <li>fries</li></ul></p>"
>>> text=re.findall("<li>([^<]*)</li>", s)
>>> tag=re.findall("<li>[^<]*</li>", s)
>>> text
['pizza', 'burgers', 'fries']
>>> tag
['<li>pizza</li>', '<li>burgers</li>', '<li>fries</li>']
>>>