我希望我能解释一下,这对你来说很容易。我需要这个,因为字符串中缺少的信息被标记为三个空格,并且令人惊讶的是,它不会为下一条信息执行\n
。
想象一下,我有一个像:
这样的字符串string <- "abc
def
ghi jkl"
我希望正则表达式的输出(可能带有strsplit()
更高级的函数):
[[1]]
[1] "abc" "" "def" "ghi" "" "jkl"
当它找到\n
时会分裂并且当它找到三个空格时它会分裂并插入一个空格。我需要将缺少的信息标记为另一个值。如果没有,那会破坏我的脚本,认为下一个信息是,例如,三个空格与def
字符串连接。
谢谢
答案 0 :(得分:5)
以下是两个解决方案,它们都使用strsplit
,但它们的分割方式不同:
1)拆分换行符删除所有提供s1
的换行符,然后在每个给出s2
的第三个字符后添加换行符。在换行符上拆分s2并用空字符串替换每个出现的三个连续空格。
Split <- function(string) {
s1 <- gsub("\n", "", string)
s2 <- gsub("(.{3})", "\\1\n", s1)
spl <- strsplit(s2, "\n")
lapply(spl, function(s) replace(s, s == " ", ""))
}
# test
string <- "abc\n def\nghi jkl"
Split(string)
## [[1]]
## [1] "abc" "" "def" "ghi" "" "jkl"
2)拆分零宽度3 char regexp 删除换行符并使用指示的正则表达式进行拆分。最后用空字符串替换每个连续的三个空格。
Split2 <- function(string) {
s1 <- gsub("\n", "", string)
spl <- strsplit(s1, "(?<=...)", perl = TRUE)
lapply(spl, function(s) replace(s, s == " ", ""))
}
# test
string <- "abc\n def\nghi jkl"
Split2(string)
## [[1]]
## [1] "abc" "" "def" "ghi" "" "jkl"
注意:1 。请注意,提供给此问题的其他答案不适用于以下输入字符串(连续有两个空字段),但此处的答案在abc
字段后连续正确识别两个空的3个字符字段:< / p>
string2 <- "abc\n def\nghi jkl" # 6 spaces before d, 3 spaces before j
Split(string2)
## [[1]]
## [1] "abc" "" "" "def" "ghi" "" "jkl"
Split2(string2)
## [[1]]
## [1] "abc" "" "" "def" "ghi" "" "jkl"
注2:上面的两个解决方案也可以使用magrittr管道很好地表达:
library(magrittr)
string %>%
gsub(pattern = "\n", replacement = "") %>%
gsub(pattern = "(.{3})", replacement = "\\1\n") %>%
strsplit("\n") %>%
lapply(function(s) replace(s, s == " ", ""))
## [[1]]
## [1] "abc" "" "def" "ghi" "" "jkl"
library(magrittr)
string %>%
gsub(pattern = "\n", replacement = "") %>%
strsplit("(?<=...)", perl = TRUE) %>%
lapply(function(s) replace(s, s == " ", ""))
## [[1]]
## [1] "abc" "" "def" "ghi" "" "jkl"
答案 1 :(得分:3)
(string <- "abc
def
ghi jkl")
# [1] "abc\n def\nghi jkl"
rle(strsplit(string, '\\s')[[1]])$values
# [1] "abc" "" "def" "ghi" "" "jkl"