regex 正在拆分原始数据列,从最后一列开始直到n个分隔符

js81xvg6  于 2022-11-26  发布在  其他
关注(0)|答案(4)|浏览(109)

嗨,我正在尝试拆分列
下面是我的df

value = c("AB/cc/dd/id,1,3,33","CC/DD/EE/F,F/GG,22,33,4","AB/cc,22,2,34","KK/SS/G,G,3,22,41")
df = data.frame(value)

我尝试拆分列并获取从最后一个“逗号(,)”到第三个“逗号(,)”的字符串
即我输出df应该如下所示

value1 = c("AB/cc/dd/id","CC/DD/EE/F,F/GG","AB/cc","KK/SS/G,G")
df_out = data.frame(value1)

我用stringr包完成了它

library(stringr)

df[c('col1', 'col2')] <- str_split_fixed(df$value, ',', 2)

先谢了

8gsdolmq

8gsdolmq1#

下面是另一种方法来获取从最后一个不带 * 的 * 正则表达式开始到第三个逗号为止的字符串:

df$value |> 
str_split(",") |> 
map(function(x)  x[1: (length(x)-3)] |> 
str_c(collapse = ","))  |> 
map_df(as.data.frame) |> 
setNames("value1")

#           value1
#1     AB/cc/dd/id
#2 CC/DD/EE/F,F/GG
#3           AB/cc
#4       KK/SS/G,G
xoefb8l8

xoefb8l82#

使用gsub

gsub("[^[:alpha:],/]", "", value) |> gsub(",+$", "", .)
[1] "AB/cc/dd/id"     "CC/DD/EE/F,F/GG" "AB/cc"           "KK/SS/G,G"

正则表达式解释:

"[^[:alpha:],/]"

  • []:定义字符列表
  • ^:否定该列表,gsub将查找匹配列表中没有的任何内容
  • [:alpha:],/:分别为列表内容、字母、逗号和“/"

",+$"

  • ,:匹配逗号
  • +:可能出现一次或多次
  • $:仅在字符串末尾
rkue9o1l

rkue9o1l3#

您可以尝试使用gsub在底数R内,如下所示

> gsub("(,[^,]+){3}$", "", value)
[1] "AB/cc/dd/id"     "CC/DD/EE/F,F/GG" "AB/cc"           "KK/SS/G,G"
xmq68pz9

xmq68pz94#

为了防止最后3个逗号之间不仅有数字,而且可能有任何其他字母数字(包括/),您可以使用以下命令:

a <- "AB/cc/dd/id,1,/gg/,33"

stringr::str_extract(a, ".*(?=(\\,[/A-z0-9]+){3})")
#> [1] "AB/cc/dd/id"

或另一种碱R溶液:

gsub("(\\,.*){3}$", "", a)

相关问题