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"
详情:
\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 个或多个空格。
我会选择 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"
我已经尝试解决这个小问题将近 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"
详情:
\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 个或多个空格。
我会选择 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"