在python中使用OR和regex匹配元素

时间:2012-09-10 15:06:21

标签: python regex logical-operators

我在python中使用regex从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+

OR

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

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

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

我的问题是,如何对其进行分组(例如使用paranthesis),以便在整个td标记之间匹配OR。

2 个答案:

答案 0 :(得分:3)

您正在使用正则表达式,但将XML与此类表达式匹配会变得太复杂,太快。

使用HTML解析器,Python有几种可供选择:

ElementTree示例:

from xml.etree import ElementTree

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

答案 1 :(得分:0)

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

而且,要回答您的问题,您可以使用非捕获分组来执行您想要的操作,如下所示:

(?:first_regex)|(?:second_regex)

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