
本文介绍如何使用 R 语言的 stringr 包精准提取 HTML 字符串中两个关键词(如 "Regeste" 和 "Sachverhalt")之间的全部内容(包括中间所有 HTML 标签与空白符),并适配大小写、支持跨行匹配,避免常见正则陷阱。
本文介绍如何使用 r 语言的 `stringr` 包精准提取 html 字符串中两个关键词(如 "regeste" 和 "sachverhalt")之间的全部内容(包括中间所有 html 标签与空白符),并适配大小写、支持跨行匹配,避免常见正则陷阱。
在网页文本解析(尤其是法律文书、政府公报等结构化 HTML)中,常需按语义区块(如
正确做法是使用带环视(lookaround)的正则表达式,配合 [sS]*(匹配任意字符,含换行)实现跨行贪婪匹配,并通过 (?仅包含两关键词之间的原始内容(不含关键词自身)。
以下是完整、健壮的解决方案:
library(dplyr)
library(stringr)
# 示例数据(已定义 df$'html')
df <- df %>%
mutate(
regeste_content = str_extract(
html,
"(?i)(?<=Regeste|regeste)[\s\S]*?(?=Sachverhalt|sachverhalt)"
)
)✅ 关键设计说明:
立即学习“前端免费学习笔记(深入)”;
- (?i):启用不区分大小写模式,兼容 Regeste/regeste 等变体;
- (?正向后查找(positive lookbehind),确保匹配位置前紧邻任一关键词,但不将其纳入结果;
- [\s\S]*?:*? 表示非贪婪匹配(推荐),防止过度捕获到后续多个 Sachverhalt 中的最后一个;[\s\S] 等价于 (?s:.),可安全匹配换行符、空格、HTML 标签等所有字符;
- (?=Sachverhalt|sachverhalt):正向先行断言(positive lookahead),确保匹配以任一关键词开头的位置为终点,同样不包含该词本身。
⚠️ 注意事项:
- 若 HTML 中存在嵌套或重复关键词(如多次出现 Regeste),非贪婪匹配 *? 可保障提取首个 Regeste 到其后最近的 Sachverhalt 之间的内容,符合多数语义需求;
- 若需严格匹配 HTML 标签边界(例如仅匹配 Regeste后到 Sachverhalt 前),应升级为 xml2::read_html() + CSS/XPath 解析,但本例中纯文本提取已足够高效;
- str_extract() 返回 NA 当无匹配——建议后续用 if_else(!is.na(regeste_content), regeste_content, "") 统一空值处理。
最终生成的 regeste_content 列将包含从 Regeste 结束处到 Sachverhalt 开始处之间的完整原始 HTML 片段(含











