【问题标题】:matching elements using OR with regex in python [duplicate]在python中使用OR与正则表达式匹配元素[重复]
【发布时间】:2012-09-10 15:06:20
【问题描述】:

我在 python 中使用正则表达式从 html 中提取数据。我写的正则表达式是这样的:

result = re.findall(r'<td align="left"  csk="(\d\d\d\d)\d\d\d\d"><a href=.?*>(.*?)</a></td>\s+|<td align="lef(.*?)" >(.*?)</td>\s+', webpage)

假设这将是遵循任一格式的 td -

<td align="left"  csk="(\d\d\d\d)\d\d\d\d"><a href=.?*>(.*?)</a></td>\s+

<td align="lef(.*?)" >(.*?)</td>

这是因为 td 可以在该特定单元格中采用不同的格式(要么有带链接的数据,要么甚至根本没有数据)。

我假设我使用的 OR 条件不正确 - 相信 OR 只匹配正则表达式前面的“just”和正则表达式后面的“just”,而不是两个完整的 td 标签之间。

我的问题是,我如何将它分组(例如用括号),以便 OR 在整个 td 标签之间匹配。

【问题讨论】:

  • 请不要使用正则表达式解析 html。看看this
  • 我了解正则表达式的局限性。我想知道如何在一般情况下以及在这种情况下应用 OR :)

标签: python regex logical-operators


【解决方案1】:

您正在使用正则表达式,但是将 XML 与此类表达式匹配起来太复杂、太快了。

改用 HTML 解析器,Python 有几个可供选择:

  • ElementTree 是标准库的一部分
  • BeautifulSoup 是一个受欢迎的第三方库
  • lxml 是一个快速且功能丰富的基于 C 的库。

元素树示例:

from xml.etree import ElementTree

tree = ElementTree.parse('filename.html')
for elem in tree.findall('tr'):
    print ElementTree.tostring(elem)

【讨论】:

  • 只要没有嵌套,理论上应该可以工作......说正则表达式是解析 xml/html 的糟糕工具选择
【解决方案2】:

&lt;td align="left" csk="(\d\d\d\d)\d\d\d\d"&gt;&lt;a href=.?*&gt;(.*?)&lt;/a&gt;&lt;/td&gt;\s+ 中,.?* 应替换为.*?

而且,为了回答您的问题,您可以使用非捕获分组来做您想做的事情,如下所示:

(?:first_regex)|(?:second_regex)

顺便说一句。您也可以将\d\d\d\d 替换为\d{4},我认为这样更易于阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多