如何将单个正则表达式组与多个后续组组合

时间:2019-02-01 18:47:24

标签: python regex

我正在修改现有的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'), 

...带有一个正则表达式。编写正则表达式来捕获组很简单。我只是不知道如何用正则表达式创建所需的输出。我尝试了环视,后向引用等的多种组合。我认为这很简单,但找不到正确的正则表达式。任何帮助表示赞赏。

此外,我完全意识到在HTML文本上使用正则表达式不是最好的方法,但是此旧系统运行良好,只需要处理这种情况即可。

类似地,我知道我可以返回各个组并轻松地在Python中创建元组。这种后处理与现有脚本非常不匹配。

1 个答案:

答案 0 :(得分:1)

建议不要尝试

regex来解析HTML。总是会有不止一种“特殊情况”使您的表情跳动。即使在单个regex表达式中可以实现所需的输出,但是如果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')]