0

可能重复:
正则表达式匹配打开的标签,XHTML 自包含标签除外

我必须在 python<td>中使用正则表达式映射多个数据<tr>

例如

<tr>
  <td>data 1</td>
  <td>data 2</td>
  <td>data 3</td>
</tr>

我想使用单个正则表达式提取 data1、data2、data3。并且可以有任意数量的<td>标签。

目前我正在使用多个正则表达式,即首先我正在映射<tr></tr>,然后<td></td>

我可以用单一的表达吗?

我想使用正则表达式来实现这一点,所以我不能使用漂亮的汤或其他 html 解析器。

4

2 回答 2

3

尽管正如其他人所建议的那样,您应该使用为该任务设计的东西来解析您的 HTML,但以下内容适用于部分情况:

re.findall(r'(?i)<td.*?>([^<]+)</td.*?>', input_str)

根据 HTML 输入的格式,您可能需要在使用re.findall(). 以下内容将从名为 的列表中读取file.html并存储任何匹配项data

import re

fh = open('file.html', 'r')
input_str = fh.read()
data = re.findall(r'(?i)<td.*?>([^<]+)</td.*?>', input_str)
fh.close()
于 2012-09-04T18:52:10.877 回答
2

编辑:我明白了,小马,他来了。我也时不时地传播这个词,因为我完全同意这种观点。但这种观点似乎在上面的评论中得到了充分表达,所以我的目的只是回答字面上的问题,“我可以用 [a] 单一的表达方式做到吗?” 简单地说:“不,除了在 .NET 中,所以继续前进。”


要回答您的实际问题:

不,您不能在单个表达式中执行此操作,除非您使用的是 .NET,据我所知,它为量化表达式中匹配的每个实例提供捕获。

你能做的最好的就是有限的、非任意的重复,例如

 /<tr>(?:\s*<td>(.*?)</td>)?(?:\s*<td>(.*?)</td>)?(?:\s*<td>(.*?)</td>)?(?:\s*<td>(.*?)</td>)?\s*</tr>/

当然,以上是粗略的,没有考虑任何其他的标签、评论等。我只是为了举例说明“有限的、非任意的”部分。

于 2012-09-04T15:43:48.500 回答