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

使用R从文本提取日期:拆分数据框中的日期与字数字段

解决字符串提取日期和字数的问题

你的问题出在原正则表达式的日期匹配规则上——原代码里的\\d{2}强制要求日期的“日”是两位数字,但你的数据里存在单数字的日(比如2 June 2004),所以正则无法匹配到目标内容。下面是针对你的数据结构的解决方案:

方法1:使用stringr包(更简洁直观)

stringr包的str_extract函数专门用于提取匹配正则的内容,非常适合这个场景:

首先安装并加载包(如果还没安装的话):

install.packages("stringr")
library(stringr)

然后处理你的数据框,提取日期和字数:

# 定义你的数据框
df <- setNames(data.frame(c("2 June 2004, 5 words, ()(","profit, Insight, 2 May 2004, 188 words, reports, by ()("), stringsAsFactors = F), "split")

# 提取日期:匹配1-2位数字 + 月份缩写 + 4位数字
df$date <- str_extract(df$split, "\\d{1,2} \\w{3} \\d{4}")

# 提取字数:匹配数字 + " words",只保留数字部分
df$word_count <- as.integer(str_extract(df$split, "\\d+(?= words)"))

# 查看结果
df

运行后你会得到包含原列、日期列和数字列的数据框,结果如下:

split        date word_count
1                      2 June 2004, 5 words, ()( 2 June 2004          5
2 profit, Insight, 2 May 2004, 188 words, reports, by ()(  2 May 2004        188

方法2:使用Base R的gsub(不依赖额外包)

如果你不想加载额外包,也可以用base R的gsub调整正则来实现:

# 提取日期
df$date <- gsub(".*?(\\d{1,2} \\w{3} \\d{4}).*", "\\1", df$split)

# 提取字数
df$word_count <- as.integer(gsub(".*?(\\d+) words.*", "\\1", df$split))

这里的关键修改是把\\d{2}改成\\d{1,2},允许匹配1位或2位的日;同时在开头加了?让正则非贪婪匹配,避免匹配到多余内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:11:45