提取 HTML 字符串中指定起止标记之间的全部内容(含标签)

提取 HTML 字符串中指定起止标记之间的全部内容(含标签)

本文介绍如何使用 r 的 stringr 包精准提取 html 文本中两个关键词(如 “regeste” 和 “sachverhalt”)之间的完整子串,包括中间所有 html 标签与空白字符,并通过正则断言实现稳健匹配。

本文介绍如何使用 r 的 stringr 包精准提取 html 文本中两个关键词(如 “regeste” 和 “sachverhalt”)之间的完整子串,包括中间所有 html 标签与空白字符,并通过正则断言实现稳健匹配。

在网页文本解析(尤其是法律文书、政府公报等结构化 HTML 内容)中,常需从原始 HTML 字符串中截取特定语义区块(例如

Regeste

Sachverhalt 之间的全部内容)。此时,简单使用 str_extract(html, “Regeste.*Sachverhalt”) 往往失败——因为默认点号 . 不匹配换行符,且会贪婪捕获到最后一个 Sachverhalt,而非紧邻的下一个。

✅ 正确解法是结合 PCRE 模式下的反向先行断言((?,配合支持跨行匹配的字符类 [sS](即“任意空白或非空白字符”,等价于 [dD] 或 [wW],但更语义清晰):

library(dplyr) library(stringr)  df %>%   mutate(between = str_extract(html, "(?<=Regeste|regeste)[sS]*(?=Sachverhalt|sachverhalt)"))

该正则表达式含义如下:

  • (?反向先行断言,要求匹配位置前紧邻 Regeste 或 regeste(大小写不敏感),但不消耗这些字符;
  • [sS]*:匹配零个或多个任意字符(含换行符),确保跨行捕获;
  • (?=Sachverhalt|sachverhalt):正向先行断言,要求匹配位置后紧邻 Sachverhalt 或 sachverhalt,同样不包含该词本身。

⚠️ 注意事项:

立即学习前端免费学习笔记(深入)”;

  • 若 HTML 中存在多个 Regeste/Sachverhalt,此模式默认返回第一个成功匹配的子串(str_extract 行为);如需全部匹配,改用 str_extract_all(…, simplify = TRUE);
  • 若需严格区分大小写,可移除 |regeste 和 |sachverhalt 分支,并添加 regex(…, ignore_case = FALSE) 参数;
  • 对于嵌套结构或复杂 HTML,建议优先使用 rvest::html_nodes() 等 DOM 解析方式;但若仅处理扁平化 HTML 片段(如已 read_html() %>% as.character() 转为字符串),本方法高效可靠;
  • 实际应用中,起止标记可能包裹在标签内(如
    Regeste

    ),上述正则仍有效,因其匹配的是文本内容而非标签结构。

? 总结:当面对非标准 HTML(无闭合标签、混杂换行与空格)且只需基于文本锚点做粗粒度切片时,str_extract + (?