R语言如何使用gsub提取字符串首个空格后的指定内容
R语言按空格拆分提取字符串内容的实现方法
你之前用gsub(" .*$", "", dob)提取首个空格前内容的逻辑,是通过正则匹配「第一个空格到字符串末尾的所有内容」并替换为空,只要调整正则匹配规则,就能实现所有空格后内容的提取需求,不需要依赖额外功能,base R的原生函数即可完成。
首先预置测试数据:
dob <- c("9/9/43 12:00 AM/PM", "9/17/88 12:00 AM/PM", "11/21/48 12:00 AM/PM")
需求1:提取首个空格后的全部内容
只需把正则逻辑反过来,匹配「字符串开头到第一个空格的所有内容」并替换为空即可。注意正则里的?是非贪婪匹配标识,确保匹配到第一个空格就停止,不会误匹配到后面的空格:
opt1 <- gsub("^.*? ", "", dob) opt1 # 运行结果 # [1] "12:00 AM/PM" "12:00 AM/PM" "12:00 AM/PM"
需求2:拆分提取空格后的时间、AM/PM标识
拿到首个空格后的完整内容后,再按第二个空格做一次拆分即可,也可以写正则一步从原始字符串提取。
提取时间部分(12:00格式)
# 基于上一步的opt1提取,匹配空格到末尾的内容替换为空 opt2_part1 <- gsub(" .*$", "", opt1) opt2_part1 # 运行结果 # [1] "12:00" "12:00" "12:00" # 一步到位写法(直接从原始dob提取,无需中间变量) # gsub("^.*? | .*$", "", dob)
提取AM/PM标识部分
# 基于opt1提取,匹配开头到第二个空格的内容替换为空 opt2_part2 <- gsub("^.*? ", "", opt1) opt2_part2 # 运行结果 # [1] "AM/PM" "AM/PM" "AM/PM" # 一步到位写法(直接从原始dob提取) # gsub("^.* ", "", dob)
拼接时间与标识部分
直接用paste函数拼接两部分即可,结果和需求1提取的完整内容完全一致:
concat_res <- paste(opt2_part1, opt2_part2) concat_res # 运行结果 # [1] "12:00 AM/PM" "12:00 AM/PM" "12:00 AM/PM"
补充说明
你之前写的正则无法得到正确结果,是因为违反了基础正则语法:*是量词,必须跟在需要重复匹配的规则/字符后面,不能单独放在开头;$是匹配字符串结尾的锚点,放在开头没有任何匹配意义。
如果习惯Excel文本分列的操作逻辑,也可以用拆分函数一次性按空格切分所有字段,直接取对应列即可:
# 按空格拆分为3列,分别对应日期、时间、AM/PM标识 split_res <- strsplit(dob, " ", fixed = TRUE) # 取日期列:sapply(split_res, `[`, 1) # 取时间列:sapply(split_res, `[`, 2) # 取标识列:sapply(split_res, `[`, 3)
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

