
本文介绍如何使用 r 的 stringr 包精准提取 html 文本中两个关键词(如 "regeste" 和 "sachverhalt")之间的完整子串,包括中间所有 html 标签与空白字符,并通过正则断言实现稳健匹配。
本文介绍如何使用 r 的 stringr 包精准提取 html 文本中两个关键词(如 "regeste" 和 "sachverhalt")之间的完整子串,包括中间所有 html 标签与空白字符,并通过正则断言实现稳健匹配。
在网页文本解析(尤其是法律文书、政府公报等结构化 HTML 内容)中,常需从原始 HTML 字符串中截取特定语义区块(例如
✅ 正确解法是结合 PCRE 模式下的反向先行断言((?,配合支持跨行匹配的字符类 [\s\S](即“任意空白或非空白字符”,等价于 [dD] 或 [wW],但更语义清晰):
library(dplyr) library(stringr) df %>% mutate(between = str_extract(html, "(?<=Regeste|regeste)[\s\S]*(?=Sachverhalt|sachverhalt)"))
该正则表达式含义如下:
- (?反向先行断言,要求匹配位置前紧邻 Regeste 或 regeste(大小写不敏感),但不消耗这些字符;
- [\s\S]*:匹配零个或多个任意字符(含换行符),确保跨行捕获;
- (?=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 + (?











