【问题标题】:How to map mutlitple <td> tag in a <tr> tag using regex in python [duplicate]如何在python中使用正则表达式在<tr>标签中映射多个<td>标签[重复]
【发布时间】:2012-09-04 14:45:19
【问题描述】:

可能重复:
RegEx match open tags except XHTML self-contained tags

我必须在 python 中使用正则表达式将多个 &lt;td&gt; 数据映射到单个 &lt;tr&gt;

例如

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

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

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

我可以用单个表达式吗?

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

【问题讨论】:

  • 你应该使用 html 解析器而不是正则表达式来解析 html
  • 只要你能保证没有嵌套标签你可能没问题...但是正则表达式 CANNOT 正确匹配嵌套项...
  • “我想用正则表达式来实现,所以我不能使用漂亮的汤或其他html解析器。”。对不起,但这有点像寻求帮助用叉子刺你的眼睛。您通常不想这样做,因为这不是一个好主意!你有什么更令人信服的理由不想使用 HTML 解析器?
  • "我想用正则表达式来实现,所以我不能使用漂亮的汤或其他 html 解析器。"为什么使用正则表达式对您如此重要?你真的不应该这样做。请阅读this
  • 虽然@zenpoy 绝对正确,但这个问题实际上并不是重复的。 “为完全重复而关闭”选择不应仅用于链接到 OP 应阅读的问题/答案。

标签: python regex python-2.7


【解决方案1】:

尽管正如其他人所建议的那样,您应该使用为该任务设计的东西来解析您的 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()

【讨论】:

    【解决方案2】:

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


    回答您的实际问题:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-16
      • 2019-01-03
      • 1970-01-01
      • 2015-04-12
      • 2016-08-15
      • 2012-07-06
      • 2021-01-11
      • 1970-01-01
      相关资源
      最近更新 更多