假设我有这样的文字:
<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>
答案 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>']
>>>