当前位置: 首页 > ds >正文

【R语言】R 语言中 gsub 与正则表达式详解(含 POSIX 与 Perl 风格实例)

R 语言中 gsub 与正则表达式详解(含 POSIX 与 Perl 风格实例)

在 R 语言中,字符串处理是非常常见的需求,R 语言中的 gsub() 函数则具有字符串替换的功能。本文将通过两个实例,帮助你深入理解 R 的 gsub()、POSIX 字符类、Perl 风格正则、以及一些常见的坑点与进阶技巧。

文章目录

  • R 语言中 `gsub` 与正则表达式详解(含 POSIX 与 Perl 风格实例)
    • 1 基础实例:POSIX 字符类
      • 1.1 `gsub()` 函数的语法规则
      • 1.2 模式 `"[[:alpha:]]+"`
      • 1.3 替换串 `"$"`
      • 1.4 匹配过程
    • 2 Perl 风格实例:`\\b\\w+\\b`
      • 2.1 `perl = TRUE`
      • 2.2 模式 `\\b\\w+\\b`
      • 2.3 替换串 `"$"`
      • 2.4 匹配过程
    • 3 常见坑与进阶
      • 3.1 标点与连字符
      • 3.2 数字与下划线
      • 3.3 Unicode 与多语言
      • 3.4 只替换首个或限定长度
    • 4 总结

1 基础实例:POSIX 字符类

来看第一个例子:

gsub("[[:alpha:]]+", "$", "Two words")
# [1] "$ $"

1.1 gsub() 函数的语法规则

  • 语法:gsub(pattern, replacement, x, ...)
  • 作用:将字符串 x所有(global)匹配 pattern 的部分替换为 replacement
    对应的 sub() 只会替换第一个匹配。

1.2 模式 "[[:alpha:]]+"

  • [[:alpha:]]:POSIX 命名字符类,表示“字母字符”,等价于 A–Z / a–z(并受 locale/编码影响)。
  • 外层方括号 [...]:字符类,匹配其中任意一个字符。
  • +:量词,表示“前面的模式重复一次或多次”。
  • 综合上述两点:[[:alpha:]]+ 匹配“一串连续字母”。

1.3 替换串 "$"

  • replacement 里,$ 是字面量,不会触发正则引用。
  • 注意,在 R 的分组回溯引用用的是 \\1\\2…,不是 $1

1.4 匹配过程

"Two words" 中:

  • Two → 匹配 → 替换为 $
  • 空格保留
  • words → 匹配 → 替换为 $
    结果:"$ $"

2 Perl 风格实例:\\b\\w+\\b

再看一个更灵活的例子,使用 Perl 风格正则:

gsub("\\b\\w+\\b", "$", "Two words", perl = TRUE)
# [1] "$ $"

2.1 perl = TRUE

  • 启用 PCRE(Perl-Compatible Regular Expressions)引擎。
  • 支持 \\b\\w、前后查看等高级语法。

2.2 模式 \\b\\w+\\b

注意:在 R 字符串中反斜杠需要转义,所以正则 \b 要写成 \\b

  • \\b:单词边界(word boundary),匹配位置,不消耗字符。
  • \\w:单词字符,等价于 [A-Za-z0-9_]
  • +:匹配一个或多个单词字符。
  • 综合:匹配“完整单词”,即两侧是边界的 \\w+

2.3 替换串 "$"

  • 同样是字面量 $

  • 若要保留原文,需要捕获组:

    gsub("(\\b\\w+\\b)", "<\\1>", "Two words", perl=TRUE)
    # "<Two> <words>"
    

2.4 匹配过程

"Two words"

  • 起始处 → 边界 → Two 匹配 → $
  • 空格保留
  • words 匹配 → $
    结果:"$ $"

其实前面所举的两个例子稍加改编后可以用来统计一段文本的单词数,请读者思考如何编写 R 语言代码可以实现这个功能?🤔
欢迎读者在评论区分享你的代码!


3 常见坑与进阶

3.1 标点与连字符

  • \\w 不包含连字符 -、撇号 '

    gsub("\\b\\w+\\b", "$", "don't well-known", perl=TRUE)
    # "$ $" (don 和 t;well 和 known)
    
  • 想把它们算作词的一部分:

    gsub("\\b[\\w'-]+\\b", "$", "don't well-known", perl=TRUE)
    

3.2 数字与下划线

  • \\w 包含数字与 _。若只想匹配纯字母词:

    gsub("\\p{L}+", "$", "C3PO and Über", perl=TRUE)
    

3.3 Unicode 与多语言

  • 默认 \\w 偏向 ASCII,不适合中文/重音字母。

  • 更稳的方法是使用 Unicode 属性:

    gsub("\\p{L}+", "$", "Über façade 中 文", perl=TRUE)
    
  • 或用 (*UCP) 提示 PCRE 按 Unicode 分类:

    gsub("(*UCP)\\b[\\p{L}\\p{N}_]+\\b", "$", "Über façade 中文", perl=TRUE)
    

3.4 只替换首个或限定长度

  • 替换首个词:

    sub("\\b\\w+\\b", "$", "Two words", perl=TRUE)
    
  • 替换长度 ≥4 的词:

    gsub("\\b(?=\\w{4,}\\b)\\w+\\b", "$", "a few longerwords", perl=TRUE)
    

4 总结

  • gsub() = 全局替换,sub() = 只进行首次替换。
  • POSIX 字符类(如 [[:alpha:]])适合基础 ASCII 场景。
  • perl=TRUE 开启 PCRE,引入 \\b\\w、前后查看等高级特性。
  • 替换串中 $ 是普通字符;回溯引用用 \\1
  • 多语言/特殊符号场景下,建议使用 \\p{...}(*UCP)
http://www.xdnf.cn/news/18024.html

相关文章:

  • 汽车电子:现代汽车的智能核心
  • [激光原理与应用-287]:理论 - 波动光学 - 电磁波既能承载能量,又能承载信息?
  • 【软件设计模式】前置知识类图、七大原则(精简笔记版)
  • Spark 运行流程核心组件(二)任务调度
  • EN/IEC 55015 照明设备的电磁兼容标准安全
  • Docker Compose部署Clickhouse最新版
  • 【LINUX网络】HTTP协议基本结构、搭建自己的HTTP简单服务器
  • 为什么游戏会出现“卡顿”:`clock.tick()` v.s. `clock.get_fps()`
  • 【uni-app】根据角色/身份切换显示不同的 自定义 tabbar
  • 线性代数 · 直观理解矩阵 | 空间变换 / 特征值 / 特征向量
  • CERT/CC警告:新型HTTP/2漏洞“MadeYouReset“恐致全球服务器遭DDoS攻击瘫痪
  • 机械加工元件——工业精密制造的璀璨明珠
  • Day14: Flask太空站搭建指南:从零到超光速的Web开发之旅
  • git clone https://gh.llkk.cc/
  • C++从入门到实战(十九)C++ vector容器及其常用接口
  • 电子电路学习日记
  • qt项目中解决关闭弹窗后执行主界面的信号槽时闪退问题
  • MySql——聚簇索引(主键索引)和非聚簇索索引(非主键索引)引区别(即聚集索引和非聚集索引区别)
  • Java 学习笔记(基础篇2)
  • Docker build创建镜像命令入门教程
  • **超融合架构中的发散创新:探索现代编程语言的挑战与机遇**一、引言随着数字化时代的快速发展,超融合架构已成为IT领域的一种重要趋势
  • ts概念讲解
  • Vue 3 + TypeScript:package.json 示例 / 详细注释说明
  • 基于Java飞算AI的Spring Boot聊天室系统全流程实战
  • 快速部署一个鉴黄服务
  • 前端vue框架
  • 【机器人-开发工具】ROS 2 (4)Jetson Nano 系统Ubuntu22.04安装ROS 2 Humble版本
  • 【Java 后端】Spring Boot 集成 JPA 全攻略
  • Nginx学习笔记(九)—— Nginx Rewrite深度解析
  • 版本更新!FairGuard-Mac加固工具已上线!