我在R中有几个类似的字符向量:

a <- "text text NOTE      3/1"
b <- "text NOTE   4.3%"

它们都有一个已知的单词-NOTE-后面跟着不同数量的空格和其他字符.

我想要做的是找到字符串中NOTE和其他字符之间的空格,然后用另一个字符替换每个空格-比如说@

所需输出将为:

"text text NOTE@@@@@@3/1"
"text NOTE@@@4.3%"

到目前为止,我只能找到找到NOTE及其后面的空格的正则表达式.

c <- gsub("NOTE\\s+", "@", a)
c
[1] "@3/1"

推荐答案

您可以使用

gsub("(?:\\G(?!^)|NOTE)\\K\\s", "@", a, perl=TRUE)

请看R demo.com/r/QQNbAV/2" rel="nofollow noreferrer">regex demo和R demo.

a <- "text text NOTE      3/1"
b <- "text NOTE   4.3%"
gsub("(?:\\G(?!^)|NOTE)\\K\\s", "@", a, perl=TRUE)
# => [1] "text text NOTE@@@@@@3/1"
gsub("(?:\\G(?!^)|NOTE)\\K\\s", "@", b, perl=TRUE)
# => [1] "text NOTE@@@4.3%"

Details:

  • (?:\G(?!^)|NOTE)-上一次成功匹配的结束或NOTE
  • \K-丢弃目前为止匹配的文本的匹配重置运算符
  • \s-一个空格字符.

下面是一个stringr版本,其中NOTE之后匹配的空格在function(x) str_replace_all(x, "\\s", "@")回调函数中分别替换为@个字符:

library(stringr)
stringr::str_replace_all(a, "NOTE\\s+", function(x) str_replace_all(x, "\\s", "@"))
# => [1] "NOTE@@@@@@3/1"
stringr::str_replace_all(b, "NOTE\\s+", function(x) str_replace_all(x, "\\s", "@"))
# => [1] "NOTE@@@4.3%"

R相关问答推荐

将coord_sf与geom_spatraster一起使用会更改分辨率

仅在ggplot的每个方面绘制最丰富的物种

如何将y轴上的线定位得彼此更近

根据固定值范围在tible中添加新行

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

基于shiny 应用程序中的日期范围子集xts索引

如果列中存在相同的字符串,则对行值进行总和

如何自定义Shapviz图?

修改用R编写的用户定义函数

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

`lazy_dt`不支持`dplyr/across`?

如何将网站图像添加到带有极坐标的面包裹条形图?

如何将使用rhandsontable呈现的表值格式化为百分比,同时保留并显示完整的小数精度?

函数可以跨多个列搜索多个字符串并创建二进制输出变量

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

手动指定从相同数据创建的叠加图的 colored颜色

如何将这个小列表转换为数据帧?

仅当后续值与特定值匹配时,才在列中回填Nas

整理ggmosaic图的标签

如何使投篮在R中保持一致