【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.pswp.cn/diannao/95703.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EN55035多媒体设备电磁兼容性抗干扰要求标准

EN55035 是一项由欧洲标准化委员会制定的电磁兼容性&#xff08;EMC&#xff09;标准&#xff0c;全称为《多媒体设备的电磁兼容性要求》。该标准主要针对多媒体设备的电磁辐射和抗干扰能力进行规范&#xff0c;确保这类设备在电磁环境中能够正常工作&#xff0c;同时不对其他设…

计算分组内时间列的最大差值

计算分组内时间列的最大差值 在 Pandas 中&#xff0c;要计算每个分组内 time 列的最大值与当前行值的差值&#xff0c;需结合 groupby() 和 transform() 方法。核心步骤如下&#xff1a;分组计算最大值 使用 transform(max) 获取每个分组中 time 列的最大值&#xff0c;结果会…

CUDA 编程笔记:CUDA延迟隐藏

一、核心概念&#xff1a;延迟隐藏&#xff08;Latency Hiding&#xff09;是 GPU 通过多线程机制掩盖指令延迟的关键技术。当某些线程束&#xff08;warp&#xff09;因指令延迟&#xff08;如内存访问或算术计算&#xff09;而等待时&#xff0c;其他就绪线程束会立即被调度执…

MySQL工具包中的其他程序

虽然有很多不同的程序&#xff0c;但有些选项是公共的&#xff0c;比兔用户名和密码&#xff0c;使用方法和MySQL相同&#xff0c;在这里统一列出&#xff0c;后面我们介绍不同的工具时&#xff0c;只讨论个性的选项以及作用以下是常用的MySQL程序&#xff1a;程序名作用mysqld…

C#WPF实战出真汁09--【消费开单】--选择菜品

1、功能介绍当选择一个空桌时&#xff0c;必须先开台才能开单&#xff0c;可以先开台&#xff0c;再开单&#xff0c;也可以开台的同时开单当选择一个用餐中的餐桌时&#xff0c;必须显示该桌前面已经点好的菜品&#xff0c;同时可以继续点餐或结账所以无论哪个功能都涉及选择菜…

大厂语音合成成本深度对比:微软 / 阿里 / 腾讯 / 火山 API 计费拆解与技术选型指南

在 AI 配音、智能客服、教育音频等场景爆发的当下&#xff0c;语音合成 API 已成为企业技术栈中的核心组件。然而&#xff0c;不同云厂商的计费规则差异显著&#xff0c;短文本 / 长文本计费分离、预付费 / 后付费价格梯度悬殊、音色授权费暗藏成本陷阱等问题&#xff0c;常导致…

Flutter开发 网络请求

HttpClient&#xff08;dart自有&#xff09; 1.get 点击请求按钮获取数据&#xff0c;解析数据获取单词展示到屏幕上。class MyState extends State {String info "暂无数据";List<Widget> texts [];overridevoid initState() {super.initState();}override…

vscode中用python调用matlab的函数(环境安装)

本实践适用于WIN11-x64和ubuntu22.04-x64系统&#xff0c;其余系统和架构未验证。 效果展示 1.环境要求 MATLAB Engine API for Python 的系统要求&#xff1a;参阅此官方文档MATLAB 与 Python 的版本兼容性&#xff1a;参阅此官方文档 2.安装步骤 安装Vscode&#xff08;不…

【数据分享】大清河(大庆河)流域上游土地利用

而今天要说明数据就是大清河&#xff08;大庆河&#xff09;流域上游土地利用。数据介绍大清河&#xff0c;又称大庆河&#xff0c;作为海河流域的重要支流&#xff0c;其流域上游地区不仅是区域水资源调控的关键节点&#xff0c;更是生态保护与经济发展的重要载体。以下从地理…

图论——Djikstra最短路

原理解释 首先解释一下它大概的应用场景以及原理&#xff1a;现在有这么一张图&#xff0c;图上各点之间都有一定的边权或者说是距离。给定你一个起点&#xff08;例如点1&#xff09;&#xff0c;让你求这个点到图上所有点的最短距离是多少&#xff1f; 这个问题比较平常&…

kafka初步介绍

Kafka角色介绍TopicTopic主题的意思&#xff0c;消费者必须指定主题用于的消息发送&#xff0c;生产者也必须指定主题用于消息的接收。topic只是逻辑上的划分。partitionpartition是分区的意思&#xff0c;他的主要作用是将发送到一个topic的数据做一个划分。如果有4个partitio…

windows10的vs2019编译openssl静态库备忘

1、下载安装openssl源码2、官网下载安装activeperl或Strawberry Perl。官网下载慢&#xff0c;网盘找找。使用中activeperl有些异常提示、缺模块&#xff0c;最后使用了Strawberry Perl。3、安装nasm。powershell使用choco install nasm -y 即可。powershell使用cd命令打开当前…

学习笔记与效率提升指南:编程、记忆与面试备考

在学习与工作中&#xff0c;高效的记录习惯、针对性的记忆方法和实用的技能储备&#xff0c;是提升效率的关键。本文结合编程学习、面试备考和英语单词积累&#xff0c;整理一套可落地的学习思路&#xff0c;尤其适合编程初学者。 一、学习核心原则&#xff1a;高效优先&#x…

顺丰面试题

1. 你擅长处理哪类问题推荐回答&#xff1a; "我比较擅长处理以下几类前端问题&#xff1a;性能优化&#xff1a;包括加载优化&#xff08;代码分割、懒加载&#xff09;、运行时优化&#xff08;减少重排重绘&#xff09;等复杂组件开发&#xff1a;如表单联动、可视化图…

Warmup_steps 设置经验

文章目录什么是 Warmup&#xff1f;实现示例科学设置 Warmup 的黄金法则直观例子什么是 Warmup&#xff1f; Warmup 是一种学习率调度策略&#xff0c;在训练初期逐步增加学习率&#xff08;LR&#xff09;&#xff0c;而不是直接使用目标学习率。它解决了两个关键问题&#x…

vue一个超简单的菜单栏伸缩示例

代码<template><div class"container"><!-- 左侧区域 --><div class"left-side" :style"{ width: leftWidth px }">左侧内容</div><!-- 右侧区域 --><div class"right-side" :style"{ l…

Spark学习(Pyspark)

&#xff08;1&#xff09;Spark基础入门 ①什么是Spark Spark是一款分布式内存计算的统一分析引擎。其特点就是对任意类型的数据进行自定义计算。Spark可以计算&#xff1a;结构化、半结构化、非结构化等各种类型的数据结构&#xff0c;同时也支持使用Python、Java、Scala、R以…

PDF压缩原理详解:如何在不失真的前提下减小文件体积?

与直接删除内容不同&#xff0c;良好的PDF压缩能在大幅减小体积的同时&#xff0c;较好地保留原有文字清晰度和图像质量&#xff0c;兼顾实用性与视觉效果。软件操作十分直观&#xff0c;仅需设置输入文件与输出路径&#xff0c;点击【开始压缩】按钮即可启动处理。画质压缩等级…

从应用场景看国产化FPGA潜力,紫光同创研讨会武汉·北京站回顾

八月&#xff0c;紫光同创 FPGA 技术研讨会先后在武汉、北京举行。作为紫光同创官方合作伙伴&#xff0c;ALINX 携紫光同创 FPGA 开发板及行业解决方案亮相&#xff0c;与来自通信、工业控制、医疗、图像视频、消费电子等领域的近 200 位行业专家齐聚一堂&#xff0c;通过主题演…

安卓APK包体优化全攻略

目录 正常默认打包流程&#xff08;以Android平台为例&#xff09; 查看编辑器打包日志 压缩图片 压缩网格模型 压缩贴图 压缩音频文件 只打64位包 最终大小 正常默认打包流程&#xff08;以Android平台为例&#xff09; 准备工作&#xff1a; 确保已安装最新版Unity H…