【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)
相关推荐
梦想的初衷~16 小时前
“R+遥感”的水环境综合评价方法实践技术应用
r语言·水环境·水文
天意生信云2 天前
生信分析自学攻略 | R软件和Rstudio的安装
经验分享·r语言
TS的美梦2 天前
【1:1复刻R版】python版火山图函数一键出图
开发语言·python·r语言·scanpy·火山图
nonono2 天前
深度学习——R-CNN及其变体
深度学习·r语言·cnn
烟锁池塘柳03 天前
【R语言】R 语言中打印含有双引号的字符串时会出现 “\” 的原因解析
r语言
凢en3 天前
Perl——qw()函数
开发语言·perl
郝学胜-神的一滴3 天前
基于C++的词法分析器:使用正则表达式的实现
开发语言·c++·程序人生·正则表达式·stl
ruleslol4 天前
python30-正则表达式
python·正则表达式
Big Cabbage6 天前
python 正则表达式
python·正则表达式