R Strsplit在第二个元素中保留分隔符

R Strsplit keep delimiter in second element

我已经尝试解决这个小问题将近 2 个小时了,但没有成功。我只是想用定界符分隔一个字符串:一个 space 后跟任何字符。在第二个元素中我想保留分隔符,而在第一个元素中它不应该出现。示例:

 x <- "123123 123 A123"
 strsplit(x," [A-Z]")

结果:

"123123 123" "A123"

但是,这并没有保留第二个元素中的字母A。 我试过使用

strsplit(x,"(?<=[A-Z])",perl=T)

但这对我的问题不起作用。也行,如果第二个元素里面有个space,就是里面的字符

如果你想遵循你的方法,你需要匹配 1+ 个空格 followed(即你需要在这里向前看)和一个字母来消耗空格:

> strsplit(x,"\s+(?=[A-Z])",perl=T)
[[1]]
[1] "123123 123" "A123"

参见PCRE regex demo

详情:

  • \s+ - 1个或多个空格(放入匹配值中,因此在拆分时将被删除)
  • (?=[A-Z]) - 大写 ASCII 字母必须立即出现在当前位置的右侧,否则匹配失败(该字母不是匹配值的一部分,并将保留在结果中)

您也可以匹配到最后一个非空白字符后跟 1+ 个空白,并使用 \K 匹配重置运算符丢弃空白之前的匹配:

> strsplit(x,"^.*\S\K\s+",perl=T)
[[1]]
[1] "123123 123" "A123"  

如果字符串包含换行符,添加 DOTALL 标志,因为默认情况下 PCRE 正则表达式中的点不匹配换行符:"(?s)^.*\S\K\s+".

详情:

  • ^ - 字符串开头
  • .* - 任何 0+ 个字符,直到最后一次出现后续子模式(即 \S\s+
  • \S - 非空白
  • \K - 在这里,删除到目前为止匹配的所有文本
  • \s+ - 1 个或多个空格。

参见 another PCRE regex demo

我会选择 stringi 套餐:

library(stringi)
x <- c("123123 123 A123","34512 321 B521")#some modified input data

l1<-stri_split(x,fixed=" ")
[1] "123123" "123"    "A123"  

然后:

lapply(seq_along(1:length(l1)),  function(x) c(paste0(l1[[x]][1]," ",l1[[x]][2]),l1[[x]][3]))

[[1]] 
[1] "123123 123" "A123"      

[[2]]
[1] "34512 321" "B521"