R - 由" \ n"拆分或三个空间,当有三个空格时至少保留一个空间

时间:2015-12-23 13:31:10

标签: regex r split

我希望我能解释一下,这对你来说很容易。我需要这个,因为字符串中缺少的信息被标记为三个空格,并且令人惊讶的是,它不会为下一条信息执行\n

想象一下,我有一个像:

这样的字符串
string <- "abc
   def
ghi   jkl"

我希望正则表达式的输出(可能带有strsplit()更高级的函数):

[[1]]
[1] "abc" "" "def" "ghi" "" "jkl"

当它找到\n时会分裂并且当它找到三个空格时它会分裂并插入一个空格。我需要将缺少的信息标记为另一个值。如果没有,那会破坏我的脚本,认为下一个信息是,例如,三个空格与def字符串连接。

谢谢

2 个答案:

答案 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"