在as string中,如何删除已知'start'和'end'的一部分?

In as string, how to remove one part which known 'start' and 'end'?

下面的dataframe中有sku名称,我想删除以'V'开头并以'b'结尾的部分,我的代码str_remove_all(sku_name,"^(V).*?(\b)$") 无法工作。

有人可以帮忙吗?

mydata <- data.frame(sku_name=c('wk0001 V1b','123780 PRO V326b','ttttt V321b'))
mydata %>% mutate(sku_name_new=str_remove_all(sku_name,"^(V).*?(\b)$"))
vec <- c('wk0001 V1b','123780 PRO V326b','ttttt V321b')
sub("V.*b$", "", vec)
# [1] "wk0001 "     "123780 PRO " "ttttt "     
stringr::str_remove(vec, "V.*b$")
# [1] "wk0001 "     "123780 PRO " "ttttt "     

这也适用于非贪婪 "V.*?b$",如有必要,请交给您。

顺便说一句:\b 是一个单词边界,而不是文字 b(V) 将它保存为一个组,这不是必需的(而且看起来有点混乱)。真正的罪魁祸首是你包含了 ^,这意味着字符串的开头(如你所提到的),只有当所有字符串都以 V 开头并且在 "Vsomethingb" 中时才会匹配。当前vec个字符串以"w""1"开头,"t"、none个以V

开头

如果您需要正则表达式指南, 是许多组件的很好指南(以及关于它们的 questions/answers 的链接)。

你可以用这个模式来做:

vector <- c('wk0001 V1b','123780 PRO V326b','ttttt V321b')

# if only numbers can be between the "V" and "b".
stringr::str_remove(vector , "V\d+b")

# if any character can be between the "V" and "b", but at least one and no "V" or "b".
stringr::str_remove(vector , "V[^Vb]+b")

你们真的很亲密。

使用@2evans 提到的一种替代方法修复正则表达式,大功告成!

我使用 dplyr 管道共享代码,因为它对您来说可能更好。

mydata <- data.frame(sku_name=c('wk0001 V1b','123780 PRO V326b','ttttt V321b'))

mydata %>% mutate(sku_name_new=str_remove_all(sku_name,"V.*b$"))

 sku_name sku_name_new
1       wk0001 V1b      wk0001 
2 123780 PRO V326b  123780 PRO 
3      ttttt V321b       ttttt