Ale*_*der 1 r pattern-matching stringr dplyr grepl
我有这样的数据
clas=c("CD_1","X.2_2","K$2_3","12k3_4",".A_5","xy_6")
df <- data.frame(clas)
> df
clas
1 CD_1
2 X.2_2
3 K$2_3
4 12k3_4
5 .A_5
6 xy_6
Run Code Online (Sandbox Code Playgroud)
我想改变一些符合这种条件的行
如果后面的字符串_是4,5和6替换字符串之前的_字符串B.所以输出应该是这样的;
clas
1 CD_1
2 X.2_2
3 K$2_3
4 12kB_4
5 .B_5
6 xB_6
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑::
如果我有这样的数据:
clas
1 CD_1
2 X.2_2
3 K$2_3
4 12k3_4
5 .A_5
6 xy_11
Run Code Online (Sandbox Code Playgroud)
然后应用您的解决方案
df %>% mutate(clas = str_replace(clas, "(.)(_[4511])", "B\\2"))
clas
1 CB_1
2 X.2_2
3 K$2_3
4 12kB_4
5 .B_5
6 xB_11
Run Code Online (Sandbox Code Playgroud)
但我只想匹配11不1.我们怎么做?
library(dplyr)
library(stringr)
clas <- c("CD_1","X.2_2","K$2_3","12k3_4",".A_5","xy_6")
df <- data.frame(clas)
df %>% mutate(clas = str_replace(clas, "(.)(_[456])", "B\\2"))
Run Code Online (Sandbox Code Playgroud)
这里放置匹配模式创建一个与3组匹配,第一组包含整个表达式匹配._[456],第二组包含.部分,第三组包含_[456]部分.
\\2访问第三组(0索引)等更换整个图案._[456]与B随后的任何匹配_[456],其中[456]是一个字符匹配任何括号内的选项.
编辑:
里面的每个字符[]都是单独处理的,所以[1111]没有区别,[1]因为该模式只匹配1或1或1或1的单个字符.相反,你需要使用|它(.)(_[45]|_11).这个匹配_4或_5或_11第二图案组英寸 此外,如果你想匹配1-9,但不是11或15,您需要使用(.)(_[45])$其中$的结束串的指标.去看看备忘单并在RegExr上测试它们.