Как объединить одну группу регулярных выражений с несколькими последующими группами - PullRequest
0 голосов
/ 01 февраля 2019

Я изменяю существующий скрипт Python, который извлекает текст из расписаний HTML с помощью регулярных выражений.Сценарий прекрасно работает, за исключением одной ситуации, которая выглядит следующим образом (очень упрощенно):

<tr>
   <td class="month">September</td>
   <td class="date">1</td>
   <td class="date">8</td>
   <td class="date">15<td>
</tr>

Я хочу вернуть:

('September', '1'),
('September', '8'),
('September', '15'), 

... с одним регулярным выражением.Написание регулярного выражения для захвата групп является тривиальным.Я просто не могу понять, как создать желаемый результат с помощью регулярных выражений.Я пробовал несколько комбинаций lookaround, обратных ссылок и т. Д. Я предполагаю, что это просто, но просто не могу найти правильное регулярное выражение.Любая помощь приветствуется.

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

Точно так жеЯ знаю, что могу вернуть отдельные группы и легко создать кортежи в Python.Такая постобработка просто не вписывается в существующий скрипт.

1 Ответ

0 голосов
/ 02 февраля 2019

regex не рекомендуется для разбора HTML.Всегда будет больше, чем один «особый случай», который запутает ваше выражение.Даже если требуемый вывод возможен в одном выражении регулярного выражения, код будет нелегко поддерживать, если HTML изменится на более позднюю дату.

Обычный подход к такой проблеме - использовать BeautifulSoup, чтобы сделать это.Для предоставленного вами HTML-кода это можно сделать следующим образом:

from bs4 import BeautifulSoup

html = """<tr>
   <td class="month">September</td>
   <td class="date">1</td>
   <td class="date">8</td>
   <td class="date">15</td>
</tr>"""

soup = BeautifulSoup(html, "html.parser")

month = soup.find('td', class_='month').text
dates = [(month, date.text) for date in soup.find_all('td', class_='date')]

print(dates)

Это будет отображать:

[('September', '1'), ('September', '8'), ('September', '15')]    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...