You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用tidyr::separate正则表达式分离含小数点的数字与字母?

解决方法

可以利用正则表达式的正向断言定位数字(含小数点)与字母的分界位置,分隔时不会截断任何字符。具体代码如下:

library(tidyr)

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

# 正确的分隔方式
separate(df, x, c("part1", "part2"), sep = "(?<=[0-9.])(?=[A-Za-z])", convert = TRUE)
#>     part1 part2
#> 1 24.1234   AAA
#> 2 14.4321   BBB

原方法问题分析

  • 第一种方法的正则[^0-9 | {.}]存在错误:多余的空格和大括号导致匹配范围混乱,实际会匹配第一个非数字、非空格、非大括号、非小数点的字符(也就是第一个字母),该字母会被当作分隔符丢弃,因此part2缺失首字母。
  • 第二种方法用([0-9.]+)作为分隔符,separate默认会丢弃匹配到的分隔符内容,而非保留为part1,所以part1变成NA,只留下字母部分。

正则说明

(?<=[0-9.])(?=[A-Za-z])是两个正向断言的组合:

  • (?<=[0-9.]):断言当前位置前面是数字或小数点
  • (?=[A-Za-z]):断言当前位置后面是字母
    这个位置是数字与字母的分界点,分隔时不会消耗任何字符,因此能完整保留两部分内容。

内容的提问来源于stack exchange,提问作者rempsyc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:46:03