regex - 将选项卡上的某些空格替换为-定界符

标签 regex r dataframe delimiter

我有一列data.frame,其中一些空格应该作为分隔符,而某些只是一个空格。

#input data
dat <- data.frame(x=c("A 2 2 textA1 textA2 Z1",
                      "B 4 1 textX1 textX2 textX3 Z2",
                      "C 3 5 textA1 Z3"))
#                               x
# 1        A 2 2 textA1 textA2 Z1
# 2 B 4 1 textX1 textX2 textX3 Z2
# 3               C 3 5 textA1 Z3

需要将其转换为5列data.frame:
#expected output
output <- read.table(text="
A   2   2   textA1 textA2   Z1
B   4   1   textX1 textX2 textX3    Z2
C   3   5   textA1  Z3",sep="\t")
#   V1 V2 V3                   V4 V5
# 1  A  2  2        textA1 textA2 Z1
# 2  B  4  1 textX1 textX2 textX3 Z2
# 3  C  3  5               textA1 Z3

本质上,需要将制表符的第1,第2,第3和最后一个空格更改为制表符(或其他任何定界符,以便于编写代码)。

regex并没有提供任何有用的信息...

注1:在实际数据中,我必须将制表符的第1个,第2个,第3个,...,第19个和最后一个空格替换。
注2: V4中没有模式,文本可以是任何东西。
注3:最后一列是一个长度可变的单词文本。

最佳答案

尝试

v1 <- gsub("^([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+", '\\1,\\2,\\3,', dat$x)
read.table(text=sub(' +(?=[^ ]+$)', ',', v1, perl=TRUE), sep=",")
#  V1 V2 V3                   V4 V5
#1  A  2  2        textA1 textA2 Z1
#2  B  4  1 textX1 textX2 textX3 Z2
#3  C  3  5               textA1 Z3

或从@Tensibai帖子中获得启发的选项
n <- 3
fpat <- function(n){
   paste0('^((?:\\w+ ){', n,'})([\\w ]+)\\s+(\\w+)$')
}

read.table(text=gsub(fpat(n), "\\1'\\2' \\3", dat$x, perl=TRUE))
#  V1 V2 V3                   V4 V5
#1  A  2  2        textA1 textA2 Z1
#2  B  4  1 textX1 textX2 textX3 Z2
#3  C  3  5               textA1 Z3

有关更多列,
 n <- 19
 v1 <- "A 24 34343 212 zea4 2323 12343 111 dsds 134d 153xd 153xe 153de 153dd dd dees eese tees3 zee2 2353 23335 23353 ddfe 3133"

 read.table(text=gsub(fpat(n), "\\1'\\2' \\3", v1, perl=TRUE), sep='')
 # V1 V2    V3  V4   V5   V6    V7  V8   V9  V10   V11   V12   V13   V14 V15
 #1  A 24 34343 212 zea4 2323 12343 111 dsds 134d 153xd 153xe 153de 153dd  dd
 #  V16  V17   V18  V19                   V20  V21
 #1 dees eese tees3 zee2 2353 23335 23353 ddfe 3133

关于regex - 将选项卡上的某些空格替换为-定界符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31002965/

相关文章:

python - 检查 pandas 数据框中是否存在某个值

python - 在 Python 中进行大量搜索/替换的有效方法?

根据分组(不是一对一查找表)将 NA 替换为另一个表中的值

r - 如何根据最终列值对矩阵中的列进行排序?

python - 尝试使用 get_loc 时出现 Pandas 错误

python - Groupby pandas 按特定公式

php - 将 3d 空格替换为逗号和字符串中的空格

java - 分割字符串保留一些分隔符但删除另一个

javascript - 获取多个字符串之间的字符串,即 HTML 标签

performance - 向量子集的最有效方法