使用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)

输出:

  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  # 正则表达式  # app  # 工具  # 数据清洗  # r语言  # xml  # 字符串  # 数据结构  # Regex  # 数据分析  # 重构  # 自动化  # 转换为  # 第二个  # 是一个  # 多个  # 结构化  # 创建一个  # 框中  # 再以  # 串列 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何在JavaScript中动态拼接PHP的base_url与jQuery变量  php转mp4怎么设置帧率_调整php生成mp4视频帧率说明【说明】  Win11怎么检查TPM2.0模块_Windows11受信任平台模块开启状态查询  如何在 PHP 中按相同键合并两个关联数组为二维数组  Win11怎么设置默认浏览器Chrome_Windows11修改默认网页打开方式  Python对象生命周期管理_创建销毁说明【指导】  php内存溢出怎么排查_php内存限制调试与优化方法【说明】  Windows7如何安装系统镜像_Windows7系统安装教程【步骤】  如何提升Golang JSON序列化性能_Golang JSON编码效率优化方法  Python面向对象实战讲解_类与设计模式深入理解  Win11如何设置计划任务 Win11定时执行程序教程【详解】  如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法  c++如何实现多态性_c++ 虚函数表原理与动态绑定机制【教程】  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  Win11怎么打开旧版计算器_Win11恢复传统计算器应用【详解】  Windows如何拦截腾讯视频广告_Windows拦截腾讯视频广告方法【方法】  如何使用Golang实现函数指针_函数变量与回调示例  如何外贸网站设计-能留住客户提升用户体验!  Python 中将 ISO 8601 时间戳转换为日期并计算日期差值的完整教程  如何使用Golang管理跨项目依赖_Golang多模块项目依赖实践  如何使用Golang开发简单的聊天室消息存储_Golang WebSocket数据持久化方法  windows如何备份注册表_windows导出和导入注册表文件教程  Win11怎么设置默认PDF阅读器 Win11修改PDF打开方式【步骤】  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】  Win11怎么关闭搜索历史_Win11清除设备上的搜索历史记录  Win11怎么开启游戏工具栏_Windows11 Xbox Game Bar快捷键  c# 如何深拷贝和浅拷贝  Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】  Win11怎么看电池循环次数_Win11笔记本电池寿命检测【命令】  C#怎么使用委托和事件 C# delegate与event编程方法  Linux如何挂载新硬盘_Linux磁盘分区格式化与开机自动挂载【指南】  c++怎么使用std::filesystem遍历文件夹_c++ 递归查找文件与权限修改【技巧】  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】  如何在 Python 测试中动态配置 @backoff 装饰器的重试次数  php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】  如何更改Windows资源管理器的默认启动位置?(快速访问/此电脑)  Python生成器表达式内存优化_惰性计算说明【指导】  Win11怎么解压RAR文件 Win11自带解压功能使用方法  Win11怎样激活系统密钥_Win11系统密钥激活步骤【攻略】  Drupal 中 HTML 链接被重复转义导致渲染异常的解决方案  Win11怎么更改盘符_Win11磁盘管理修改驱动器号【步骤】  Win11怎么设置快速访问主页_Windows11资源管理器文件夹选项  Win10怎样卸载TeamViewer_Win10卸载TeamViewer步骤【教程】  php订单日志怎么导出excel_php导出订单日志到表格教程【教程】  C++如何编写函数模板?(泛型编程入门)  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Windows10系统服务优化指南_Win10禁用不必要服务提升性能 

 2025-11-18

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.