【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)
。