Совпадение нескольких полных абзацев HTML, содержащих текст в скобках - PullRequest
1 голос
/ 17 апреля 2019

Мне нужно сопоставить полные абзацы HTML, содержащие текст в тройных фигурных скобках.

Вот мой входной HTML:

<p><strong>{{{Lorem ipsum dolor sit amet.</strong></p>
<p>Ut enim ad minim veniam.</p>
<p>Duis aute irure dolor}}}</p>
<p><em>Excepteur sint occaecat cupidatat non proident.</em></p>
<p><strong><em>Sed {{{ut perspiciatis unde omnis iste natus error.</em></strong><em> sit voluptatem accusantium doloremque laudantium.</em></p>
<p>Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet.}}}</p>
<p>Ut enim ad minima veniam, quis nostrum exercitationem.</p>

Следующие фрагменты должны совпадать:

<p><strong>{{{Lorem ipsum dolor sit amet.</strong></p>
<p>Ut enim ad minim veniam.</p>
<p>Duis aute irure dolor}}}</p>

и

<p><strong><em>Sed {{{ut perspiciatis unde omnis iste natus error.</em></strong><em> sit voluptatem accusantium doloremque laudantium.</em></p>
<p>Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet.}}}</p>

В настоящее время я пытаюсь использовать следующее регулярное выражение:

<p>.*?{{{.*?}}}<\/p>/gms

Очевидно, это не работает должным образом.

Вот пример Regex101: https://regex101.com/r/9NSMy3/2

Я знаю, что это не лучшая идея использовать регулярные выражения для анализа HTML, поэтому любые другие решения также высоко ценятся.

1 Ответ

1 голос
/ 17 апреля 2019

Вы можете использовать анализатор HTML, чтобы найти все элементы p, проверить каждый из них на совпадение с помощью оператора in и сохранить совпадения в списке.Здесь я проверяю, был ли ранее виден набор открывающих скобок (чтобы отслеживать текущее совпадение) с флагом begin.

from bs4 import BeautifulSoup

inputhtml = '''
<p><strong>{{{Lorem ipsum dolor sit amet.</strong></p>
<p>Ut enim ad minim veniam.</p>
<p>Duis aute irure dolor}}}</p>
<p><em>Excepteur sint occaecat cupidatat non proident.</em></p>
<p><strong><em>Sed {{{ut perspiciatis unde omnis iste natus error.</em></strong><em> sit voluptatem accusantium doloremque laudantium.</em></p>
<p>Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet.}}}</p>
<p>Ut enim ad minima veniam, quis nostrum exercitationem.</p>
'''

soup = BeautifulSoup(inputhtml,'html.parser')

fragments = []
begin = False
for p in soup.find_all('p'):
    if '{{{' in p.text:
        begin = True
        fragments.append(str(p))
    if '}}}' in p.text:
        begin = False
    if '}}}' in p.text and not '{{{' in p.text:
        fragments[-1] += str(p)
    elif begin and not '{{{' in p.text and not '}}}' in p.text:
        fragments[-1] += str(p)

print(fragments)

Выход:

['<p><strong>{{{Lorem ipsum dolor sit amet.</strong></p><p>Ut enim ad minim veniam.</p><p>Duis aute irure dolor}}}</p>',
'<p><strong><em>Sed {{{ut perspiciatis unde omnis iste natus error.</em></strong><em> sit voluptatem accusantium doloremque laudantium.</em></p><p>Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet.}}}</p>']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...