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

