我正试图进入R中的文本分析,我有一个具有以下结构的文本文件。
HD A YEAR Oxxxx
WC 244 words
PD 28 February 2018
SN XYZ
SC hydt
LA English
CY Copyright 2018
LP Rio de Janeiro, Feb 28
TD
With recreational cannabis only months away from legalization in Canada, companies are racing to
prepare for the new market. For many, this means partnerships, supply agreements,我想在R中提取以下元素(PD和TD),并保存到一个表中。
我已经试过了,但是我没能把它做对。
提取物PD
library(stringr)
library(tidyverse)
pd <- unlist(str_extract_all(txt, "\\bPD\\b\t[0-9]+?\\s[A-Za-z]+?\\s[0-9]+\\s"))
pd <- str_replace_all(pd, "\\bPD\\b\t", "")
if (length(pd) == 0) {
pd <- as.character(NA)
}
pd <- str_trim(pd)
pd <- as.Date(strptime(pd, format = "%d %B %Y"))提取物TD
td <- unlist(str_extract_all(txt, "\\bTD\\b[\\t\\s]*?.+?\\bCO\\b"))
td <- str_replace_all(td, "\\bTD\\b[\\t\\s]+?", "")
td <- str_replace_all(td, "\\bCO\\b", "")
td <- str_replace_all(td, "\\s+", " ")
if (length(td) == 0) {
td <- as.character(NA)请给我以下的桌子:
PD TD
28 February 2018 With recreational cannabis only months away from
legalization in Canada, companies are racing to
prepare for the new market. For many, this means
partnerships, supply agreements, Production hit a
record 366.5Mt任何帮助都将不胜感激。谢谢
发布于 2018-04-04 12:37:26
[我不得不在数据集的末尾添加几个字符,这是我从您的regexes中推断出来的:
txt <- "HD A YEAR Oxxxx
WC 244 words
PD 28 February 2018
SN XYZ
SC hydt
LA English
CY Copyright 2018
LP Rio de Janeiro, Feb 28
TD
With recreational cannabis only months away from legalization in Canada, companies are racing to
prepare for the new market. For many, this means partnerships, supply agreements,
CO ...further stuff"脏的
解决问题的方法可能是:
PD文本之后的任意空格。\\bPD\\b [0-9]+?\\s[A-Za-z]+?\\s[0-9]+\\s"为我工作。TD字段,使用dotall=选项使regex多行:(参见?stringr::regex)
td <- unlist(str_extract_all(txt,regex("\bTD\b\t\s*?.+?\bCO\b",dotall=TRUE))也许短时间的雷克斯更好?
但是,我建议您捕获输入格式的特征,只需细粒度即可。例如,我不会通过regex检查日期格式。只需搜索"^ PD.*"并让R尝试解析结果。如果不匹配的话,它还是会抱怨的。
要筛选以多个空格开头的文本块,如TD标记之后的空格,您可以使用multiline=选项来使用^来匹配每一行(不仅仅是第一行)。例如。
str_extract_all(txt, regex("^TD\\s+(^\\s{3}.*\\n)+", multiline = TRUE))(请注意regex类\s包含\n,因此我不需要在匹配TD行之后显式地指定)
如果字段丢失,请小心
最后,如果输入中有一个TD或PD字段丢失,则当前的方法可能会将错误的日期分配给文本!将for循环与readLines (而不是regex匹配)组合起来可能有助于实现这一点:
https://stackoverflow.com/questions/49648624
复制相似问题