【问题标题】:Python regex: how to extract inner data from regexPython 正则表达式:如何从正则表达式中提取内部数据
【发布时间】:2011-04-21 03:01:41
【问题描述】:

我想从这样的正则表达式中提取数据:

<td>[a-zA-Z]+</td><td>[\d]+.[\d]+</td><td>[\d]+</td><td>[\d]+.[\d]+</td>  

我找到了相关问题extract contents of regex 但就我而言,我应该以某种方式进行迭代。

【问题讨论】:

  • 请澄清:您是试图从该字符串还是通过使用该字符串(正则表达式)提取数据?对于后者,您需要使用括号来构建组,就像在您链接到的问题的已接受答案中一样。
  • 我已经使用该字符串提取数据,现在我想从中提取数据,只需删除 标记。
  • stackoverflow.com/questions/1732348/… StackOverflow 软件应该在任何时候发布这个“正则表达式”并且 HTML 标记出现在同一个帖子中。简短版:正则表达式无法解析 HTML。

标签: python html regex


【解决方案1】:

正如海报所阐明的,应该从字符串中删除

标签。

请注意,您向我们展示的字符串就是:字符串。只有在正则表达式函数的上下文中使用它才是正则表达式(可以从中编译出一个正则表达式对象)。

您可以像这样简单地删除

标记(假设您的字符串存储在 s 中): s.replace('&lt;td&gt;','').replace('&lt;/td&gt;','')

但请注意陷阱:正如其他人指出的那样,这在真正的 HTML 上下文中的用途确实有限。

此外,您应该知道,无论留下什么正则表达式 [string],您可以用它解析的内容可能不是您想要的,即它不会自动匹配之前没有

标签的任何内容!

【讨论】:

  • 是的,这就是我首先做的,但我一直在寻找更好的解决方案
  • 在什么方面更好?如果您所做的只是删除东西,那么这样一个简单的解决方案就完全可以了。尽量保持代码简单(但不要简单)。
【解决方案2】:

正如辣椒粉在他/她的评论中提到的,您需要使用 () 来识别任何匹配文本的所需部分,以触发捕获组。要从 td 标记中获取内容,请更改:

<td>[a-zA-Z]+</td><td>[\d]+.[\d]+</td><td>[\d]+</td><td>[\d]+.[\d]+</td> 

到:

<td>([a-zA-Z]+)</td><td>([\d]+.[\d]+)</td><td>([\d]+)</td><td>([\d]+.[\d]+)</td>
     ^^^^^^^^^           ^^^^^^^^^^^           ^^^^^           ^^^^^^^^^^^
      group 1             group 2              group 3          group 4

然后按编号访问组。 (只是第一行,带有 '^' 的行和命名组的行只是为了帮助您查看括号中指定的捕获组。)

dataPattern = re.compile(r"<td>[a-zA-Z]+</td>... etc.")
match = dataPattern.find(htmlstring)
field1 = match.group(1)
field2 = match.group(2)

等等。但是你应该知道,使用 re 来破解 HTML 源代码是通向疯狂的途径之一。有许多潜在的惊喜会潜伏在你的输入 HTML 中,它们是完美工作的 HTML,但很容易打败你的回复:

  • “

    ”而不是“ ”
  • 标签之间或数据与标签之间的空格

  • " "空格字符

  • BeautifulSoup、lxml 甚至 pyparsing 之类的库将使网络抓取工具更加强大。

    【讨论】:

    猜你喜欢
    • 2019-05-13
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2010-09-12
    • 2011-08-06
    相关资源
    最近更新 更多