0

0

使用R语言与stringr包从HTML字符串中提取结构化信息

DDD

DDD

发布时间:2025-11-18 12:44:02

|

537人浏览过

|

来源于php中文网

原创

使用R语言与stringr包从HTML字符串中提取结构化信息

本教程详细介绍了如何利用r语言中的`stringr`包和正则表达式,从包含复杂html标签的字符串列中精准提取特定数据,并将其转换为新的独立列。文章通过具体代码示例,演示了从原始数据准备、模式匹配、数据清洗到最终整合的完整流程,旨在帮助用户高效处理非结构化文本数据,实现数据结构的优化与重构。

引言:解析复杂字符串数据的挑战

在数据分析实践中,我们经常会遇到需要从非结构化或半结构化字符串中提取特定信息的场景。例如,一个数据框的某一列可能包含长篇的HTML片段、XML结构或自定义格式的文本,其中混杂着我们所需的关键数据。手动解析这些字符串既耗时又容易出错。R语言提供了强大的文本处理能力,特别是结合stringr包和正则表达式,可以高效、准确地自动化这一过程。

本教程将以一个具体的例子,演示如何从包含标签的HTML字符串中提取对应的数值和文本信息,并将其转化为数据框中的独立列。

R语言与stringr包:文本处理利器

stringr是R语言中一个现代化、用户友好的字符串处理包,它提供了一系列功能强大且直观的函数,用于字符串的检测、提取、替换、分割等操作。其核心优势在于与正则表达式(Regex)的无缝集成,使得复杂的模式匹配和数据提取变得简单高效。

正则表达式是一种描述字符串模式的强大工具。通过学习和掌握正则表达式,我们可以定义出极其精确的匹配规则,从而在各种复杂的文本中找到并操作目标数据。

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

实战演练:从HTML字符串中提取数据

我们将通过一个具体的案例来演示如何利用stringr包和正则表达式从HTML字符串中提取数据。

1. 准备示例数据

首先,我们创建一个包含姓名(name)和生物信息(bio)的数据框。bio列中包含了我们希望提取的信息。为了演示健壮性,我们额外添加了一行不包含所有目标标签的数据。

library(stringr)

# 示例数据
name <- c("John", "Max", "Jane")
bio <- c(
    "1Revisor",
    "119.06.1995Tech",
    "1990Reading" # 示例:没有status和profession标签
)

df <- data.frame(name, bio)
print(df)

输出:

ReRoom AI
ReRoom AI

专为室内设计打造的AI渲染工具,可以将模型图、平面图、草图、照片转换为高质量设计效果图。

下载
  name                                                bio
1 John    1Revisor
2  Max 119.06.1995Tech
3 Jane                   1990Reading

2. 提取“status”信息

我们需要从bio列中提取标签内的数字。这个过程分为两步:首先匹配包含完整标签的字符串,然后替换掉标签,只保留数字。

# 步骤1: 使用 str_extract_all 提取包含  标签的完整字符串
# pattern = "\\d" 匹配以  开头,接着一个数字(\\d),再以  结尾的字符串。
status_list <- stringr::str_extract_all(df$bio, pattern = "\\d")
print("提取到的原始status列表:")
print(status_list)

# 步骤2: 使用 str_replace_all 替换标签,只保留数字
# pattern = "()(\\d)()" 定义了三个捕获组。
# "\\2" 表示在替换时只使用第二个捕获组的内容(即数字)。
status_cleaned_list <- stringr::str_replace_all(status_list, pattern = "()(\\d)()", "\\2")
print("清洗后的status列表:")
print(status_cleaned_list)

# 将列表转换为向量,并处理无匹配时产生的 NA
status_vector <- as.numeric(unlist(lapply(status_cleaned_list, function(x) if(length(x) == 0) NA else x)))
print("转换为向量的status:")
print(status_vector)

输出:

[1] "提取到的原始status列表:"
[[1]]
[1] "1"

[[2]]
[1] "1"

[[3]]
character(0)

[1] "清洗后的status列表:"
[[1]]
[1] "1"

[[2]]
[1] "1"

[[3]]
character(0)

[1] "转换为向量的status:"
[1]  1  1 NA

3. 提取“profession”信息

与提取status类似,我们从bio列中提取标签内的职业名称。

# 步骤1: 使用 str_extract_all 提取包含  标签的完整字符串
# pattern = "[:alpha:]*" 匹配  开头,接着零个或多个字母字符 ([:alpha:]*),再以  结尾。
profession_list <- stringr::str_extract_all(df$bio, pattern = "[:alpha:]*")
print("提取到的原始profession列表:")
print(profession_list)

# 步骤2: 使用 str_replace_all 替换标签,只保留职业名称
# pattern = "()([:alpha:]*)()" 定义了三个捕获组。
# "\\2" 表示只保留第二个捕获组的内容(即职业名称)。
profession_cleaned_list <- stringr::str_replace_all(profession_list, pattern = "()([:alpha:]*)()", "\\2")
print("清洗后的profession列表:")
print(profession_cleaned_list)

# 将列表转换为向量,并处理无匹配时产生的 NA
profession_vector <- unlist(lapply(profession_cleaned_list, function(x) if(length(x) == 0) NA_character_ else x))
print("转换为向量的profession:")
print(profession_vector)

输出:

[1] "提取到的原始profession列表:"
[[1]]
[1] "Revisor"

[[2]]
[1] "Tech"

[[3]]
character(0)

[1] "清洗后的profession列表:"
[[1]]
[1] "Revisor"

[[2]]
[1] "Tech"

[[3]]
character(0)

[1] "转换为向量的profession:"
[1] "Revisor" "Tech"    NA

4. 整合结果到新的数据框

最后,我们将提取并清洗后的status和profession向量作为新列,添加到原始数据框中,或创建一个新的数据框。

df_final <- data.frame(
    name = df$name,
    status = status_vector,
    profession = profession_vector
)
print(df_final)

输出:

  name status profession
1 John      1    Revisor
2  Max      1       Tech
3 Jane     NA       

正则表达式模式解析

理解本教程中使用的正则表达式模式是掌握其核心的关键:

  • \\d: 匹配任何单个数字字符(0-9)。
  • [:alpha:]: 匹配任何单个字母字符(a-z, A-Z)。
  • *: 量词,匹配前一个元素零次或多次。例如,[:alpha:]* 匹配零个或多个字母。
  • (): 捕获组。括号内的模式匹配到的内容会被“捕获”,可以在替换字符串中通过 \\1、\\2 等引用。
    • 在 "()(\\d)()" 中:
      • () 是第一个捕获组。
      • (\\d) 是第二个捕获组,捕获数字。
      • () 是第三个捕获组。
    • 因此,\\2 指代的就是捕获到的数字。
  • str_extract_all(): 返回一个列表,其中每个元素对应输入向量中的一个字符串,该元素是一个字符向量,包含所有匹配到的子字符串。
  • str_replace_all(): 对输入字符串中所有匹配到的模式进行替换。如果输入是一个列表,它会对列表中的每个元素进行操作。

注意事项与

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

247

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

211

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

349

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

232

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

528

2023.12.06

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

9

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

AngularJS教程
AngularJS教程

共24课时 | 2.5万人学习

CSS教程
CSS教程

共754课时 | 18.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号