如何在'tidyr::separate' regex中将数字(包括点分隔符)与字母分隔开?

nxowjjhe  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(199)

如何在tidyr::separate正则表达式中将数字(包括点分隔符)与字母分隔开?在我目前的尝试中,似乎第二个字符串的第一个字母被砍掉了。
复溶:

df <- data.frame(x = c("24.1234AAA", "14.4321BBB"))
df
#>            x
#> 1 24.1234AAA
#> 2 14.4321BBB

# This works but it is missing the first letter of the string
tidyr::separate(df, x, c("part1", "part2"), sep = "[^0-9 | {.}]", extra = "merge", convert = TRUE)
#>     part1 part2
#> 1 24.1234    AA
#> 2 14.4321    BB

# This gets the letter string completely, but not the numbers
tidyr::separate(df, x, c("part1", "part2"), sep = "([0-9.]+)", extra = "merge", convert = TRUE)
#>   part1 part2
#> 1    NA   AAA
#> 2    NA   BBB

创建于2022年12月31日,使用reprex v2.0.2
注意:数字和字母的长度并不总是相同的,所以我们不能用数字向量作为tidyr::separatesep参数。

bnlyeluc

bnlyeluc1#

使用regex lookaround拆分数字(\\d)和字母([A-Z]

tidyr::separate(df, x, c("part1", "part2"), 
    sep = "(?<=\\d)(?=[A-Z])", extra = "merge", convert = TRUE)
  • 输出
part1 part2
1 24.1234   AAA
2 14.4321   BBB

或者将extract与捕获组一起使用

tidyr::extract(df, x, c("part1", "part2"), "^([0-9.]+)(\\D+)", convert = TRUE)
    part1 part2
1 24.1234   AAA
2 14.4321   BBB

相关问题