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

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

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

文章目录

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

1 基础实例:POSIX 字符类

来看第一个例子:

r 复制代码
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 风格正则:

r 复制代码
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 替换串 "$"

  • 同样是字面量 $

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

    r 复制代码
    gsub("(\\b\\w+\\b)", "<\\1>", "Two words", perl=TRUE)
    # "<Two> <words>"

2.4 匹配过程

"Two words"

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

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

欢迎读者在评论区分享你的代码!


3 常见坑与进阶

3.1 标点与连字符

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

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

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

3.2 数字与下划线

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

    r 复制代码
    gsub("\\p{L}+", "$", "C3PO and Über", perl=TRUE)

3.3 Unicode 与多语言

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

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

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

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

3.4 只替换首个或限定长度

  • 替换首个词:

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

    r 复制代码
    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)
相关推荐
张彦峰ZYF1 小时前
Python 模式匹配与高效正则表达式:从语言特性到工程级简单实践
python·正则表达式
Davina_yu6 小时前
R语言报错:无法打开文件‘sales_2025.txt‘: No such file or directory
开发语言·r语言
小小8程序员7 小时前
R 语言 4.5.0 全解析:性能优化、新特性与使用指南下载安装步骤
r语言
小北方城市网7 小时前
第2课:零基础前端框架实操入门——从核心语法到第一个完整项目
javascript·ai·正则表达式·json·html5
墨&白.1 天前
如何卸载/更新Mac上的R版本
开发语言·macos·r语言
无限大.1 天前
为什么“云计算“能改变世界?——从本地计算到云端服务
开发语言·云计算·perl
Lun3866buzha2 天前
【深度学习】Mask R-CNN在温室番茄成熟度检测中的应用——基于ResNet18与FPN的多级特征融合分类系统
深度学习·r语言·cnn
铉铉这波能秀2 天前
正则表达式从入门到精通(字符串模式匹配)
java·数据库·python·sql·正则表达式·模式匹配·表格处理
利刃大大2 天前
【JavaSE】Stream API && Optiona类 && 正则表达式
正则表达式
Katecat996633 天前
夜间收费站与道路场景多类型车辆检测与分类:基于Faster R-CNN R50 PAFPN的实现_1
分类·r语言·cnn