如何使用正则表达式提取字符串中日期模式后的全部文本?
提取指定日期模式后的全部文本解决方案
问题背景
已通过str_extract(tt1, "(\\d{2}\\s{1}\\w{3}\\s{1}\\d{4})")匹配到目标日期“07 Dec 2019”,但使用str_extract(tt1, "(\\d{2}\\s{1}\\w{3}\\s{1}\\d{4}).*")仅能提取日期所在行的部分文本且包含日期,无法获取日期后的完整内容。
待处理字符串:
tt1 <- "Football\n/\n\nColombia\n\n/\nLiga Aguila 2019\n07 Dec 2019 - Clausura - Play Offs\n1\nX\n2\nB's\n\n22:00\n\nAmerica De Cali\n\n2\n2\n–\n0\n\nJunior\n\n0\n\n2.18\n\n2.99\n\n3.59\n\n9"
预期输出:
" - Clausura - Play Offs\n1\nX\n2\nB's\n\n22:00\n\nAmerica De Cali\n\n2\n2\n–\n0\n\nJunior\n\n0\n\n2.18\n\n2.99\n\n3.59\n\n9"
解决方案
核心原因
原正则表达式中,.默认不匹配换行符,因此只能匹配到日期所在行的后续内容,无法覆盖换行后的文本。需要调整正则匹配规则或使用更直接的字符串处理方法。
方法1:移除日期部分(最直观)
使用str_remove直接删除匹配到的日期模式,剩余内容即为目标文本:
library(stringr) result <- str_remove(tt1, "\\d{2}\\s\\w{3}\\s\\d{4}") cat(result)
方法2:分组捕获日期后内容
利用str_match的分组功能,捕获日期之后的所有文本:
result <- str_match(tt1, "(?s)\\d{2}\\s\\w{3}\\s\\d{4}(.*)")[1, 2] cat(result)
(?s)开启dotall模式,让.匹配包括换行在内的所有字符。
方法3:正向预查匹配(不包含日期)
使用正向预查(?<=...),直接匹配日期之后的全部文本,无需额外处理:
result <- str_extract(tt1, "(?s)(?<=\\d{2}\\s\\w{3}\\s\\d{4}).*") cat(result)
修复原方法
如果坚持使用str_extract,只需开启dotall模式并通过分组或预查排除日期:
# 方式A:捕获分组后取第二部分 result <- str_extract(tt1, "(?s)\\d{2}\\s\\w{3}\\s\\d{4}(.*)") result <- sub("^\\d{2}\\s\\w{3}\\s\\d{4}", "", result) # 方式B:直接用正向预查(更简洁) result <- str_extract(tt1, "(?s)(?<=\\d{2}\\s\\w{3}\\s\\d{4}).*")
内容的提问来源于stack exchange,提问作者M.O
相关产品推荐
相关产品推荐

