如何用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
相关产品推荐
相关产品推荐

