我一直试图解决这个小问题近2个小时,但没有成功。我只是想用分隔符分隔一个字符串:一个空格后跟任何字符。在第二个元素中我想保留分隔符,而在第一个元素中它不会出现。例如:
x <- "123123 123 A123"
strsplit(x," [A-Z]")
结果:
"123123 123" "A123"
但是,这并没有将字母A保留在第二个元素中。 我尝试过使用
strsplit(x,"(?<=[A-Z])",perl=T)
但这对我的问题不起作用。它也没关系,如果第二个元素中有空格,它只需要其中的字符。
答案 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+
- 一个或多个空格。答案 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"