Совпадение текста в скобках несколько раз - PullRequest
0 голосов
/ 20 марта 2019

Предположим, у меня есть такой текст:

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

Я хочу использовать одно регулярное выражение для извлечения всего текста между тегами <li> / list с использованием python.

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

Возвращает только первый элемент в списке, окруженный тегами <li> / list:

<li>pizza</li>

Есть ли способ для меня собрать все элементы между тегами <li> / list, чтобы мой вывод выглядел так:

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

Ответы [ 4 ]

4 голосов
/ 21 марта 2019

Это должно работать:

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>
2 голосов
/ 21 марта 2019

Предполагая, что вы уже извлекли пример строки, которую вы заявляете, вы можете сделать:

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>']
1 голос
/ 21 марта 2019

Зачем вам нужны <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
0 голосов
/ 21 марта 2019

Попробуйте это регулярное выражение с 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>']
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...