R中多个符号前的gsub字符串

R中多个符号前的gsub字符串,r,regex,gsub,R,Regex,Gsub,我试图在R中将一列中的多个符号前的字符串合并在一起。让我用一个例子来解释 data <- data.frame(c("1_a-b","2: b-c","3_c-d")) colnames(data) <- "ABC" data如何使用stringr包 library(stringr) df %>% mutate( ABC = as.character(ABC), new = if_else( str_detect(ABC, "\\w\\-\\

我试图在R中将一列中的多个符号前的字符串合并在一起。让我用一个例子来解释

data <- data.frame(c("1_a-b","2: b-c","3_c-d"))
colnames(data) <- "ABC"

data如何使用
stringr

library(stringr)
df %>% 
  mutate(
    ABC = as.character(ABC),
    new = if_else(
      str_detect(ABC, "\\w\\-\\w"),
      str_extract(ABC, "\\w\\-\\w"),
      ABC
    )
  )

     ABC new
1  1_a-b a-b
2 2: b-c b-c
3  3_c-d c-d

更改为包含if-else语句-遗漏了您对检查该序列感兴趣的内容。

如果您需要删除到最后一个
\uu
,则可以使用以下正则表达式:

sub(".*[_:]\\s*", "", data$ABC)
sub(".*?[_:]\\s*", "", data$ABC)
或者,如果您最多需要删除第一个

sub(".*[_:]\\s*", "", data$ABC)
sub(".*?[_:]\\s*", "", data$ABC)
图案细节

  • *?
    -任何0个以上字符,尽可能少(
    *
    匹配0个或更多字符)
  • [\::][/code>-a
  • \s*
    -0+空格
请参阅和:


也许
“*[\:]\\s*”
?我不知道这是否真的解决了OP使用
作为分隔符的用例。“.*[\:]\\s*”真的很好用,我相信是有效的。不相关,但grepl(“+”,“250K”)给了我真实的,你知道为什么吗?@BruceWayne这就是TRE处理与模式初始位置的量词相关的未定义正则表达式行为的方式。您通常无法量化模式的开始,这显然是用户错误。TRE在这方面相当宽松,因此您可以依赖PCRE-
grepl(“+”,“”,perl=TRUE)
将向您显示一个错误。有什么替代方法?除了这个:“+“%in%”“250K”,就像我提到的,使用PCRE。@BruceWayne如果你只需要检查一个文本字符串,为什么还要用正则表达式呢?使用
grepl(“+”,“250K”,fixed=TRUE)
将显示
FALSE
sub(".*?[_:]\\s*", "", data$ABC)
data <- data.frame(c("1_a-b","2: b-c","3_c-d"))
colnames(data) <- "ABC"
if(any(grepl(":|_", data$ABC))){
   data$ABC <- sub(".*[_:]\\s*", "", data$ABC)
} 
  ABC
1 a-b
2 b-c
3 c-d