r - 如何将没有 am 或 pm 的所有数字替换为标准字符串?
问题描述
我有一个如下所示的向量:
x <- c('3b and to 10 am ','1c and to 12 pm','#01-93 and to 10 am ')
我需要将所有没有字符串 am 或 pm 的数字替换为 "none" 。所以我尝试使用
sub('.*-([0-9]+).*' ,'none',x)
但这不起作用。我的预期输出如下:
x <- c('none and to 10 am ','none and to 12 pm','none and to 10 am ')
任何帮助表示赞赏。
解决方案
我们可以使用带有前瞻的正则表达式来检查上午或下午。我使用了 stringr 包,但它也应该与基本函数一起使用。
library(stringr)
str_replace(x, "(\\S*[0-9]+\\S*)(?!\\S*\\s(am|pm))", "none")
# > "none and to 10 am " "none and to 12 pm" "none and to 10 am "
如果每个元素中可能有多个数字要替换,请使用str_replace_all()
代替str_replace()
如果你想摆脱多余的空间,我建议使用stringr::str_squish()
.
正则表达式分解
\\S*
查找零个或多个非空白字符。[0-9]
匹配数字 0 - 9。所以
(\\S*[0-9]+\\S*)
寻找一个两边都有零个或多个非空白字符的数字。这匹配您示例中的所有情况,但如果此假设不正确,您可能必须更具体。\\s
匹配一个空白字符(am|pm)
匹配上午或下午(?!x)
向前看并打折任何后跟 x 的匹配项因此
(?!\\S*\\s(am|pm))
,向前看并折扣任何在下一个空格之后具有 am 或 pm 的匹配项。这对于打折第二个数字至关重要。
推荐阅读
- java - Java - 通过使用文件中的数据构建不同类型的对象来填充列表
- azure - 用户授权密钥与帐户密钥 - 安全性?
- php - 无法打开文件“app/tests/php/Test.php”
- three.js - 模板缓冲区交叉点可视化
- macos - 弹出dbca(oracle数据库配置助手)窗口时xquartz颜色问题
- react-native - 反应导航自定义标签栏动画不起作用
- mysql - Laravel 在 200 万条记录上给出超时错误
- reactjs - MUI 0.20.x 和 MUI 4.44 未加载基于更高版本的页面无法正确呈现
- pandas - 如何在熊猫中使用阈值进行映射
- amazon-web-services - AWS ECS FARGATE 的日志记录