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

时间:2017-06-21 11:13:04

标签: r regex strsplit

我一直试图解决这个小问题近2个小时,但没有成功。我只是想用分隔符分隔一个字符串:一个空格后跟任何字符。在第二个元素中我想保留分隔符,而在第一个元素中它不会出现。例如:

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

结果:

"123123 123" "A123"

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

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

但这对我的问题不起作用。它也没关系,如果第二个元素中有空格,它只需要其中的字符。

2 个答案:

答案 0 :(得分:3)

如果你想要按照你的方法,你需要匹配1+空格跟随(即你需要一个前瞻性),并带一个字母来消耗空格:

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

请参阅PCRE regex demo

<强>详情:

  • \s+ - 一个或多个空格(放入匹配值,因此在拆分时将被删除)
  • (?=[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+ - 一个或多个空格。

请参阅another PCRE regex demo

答案 1 :(得分:1)

我会选择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"