我正在尝试在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 <- 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
任何帮助将不胜感激。谢谢
答案 0 :(得分:2)
[我必须在数据集的末尾添加几个字符,我从你的正则表达式中推断出来了:
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=
选项使您的正则表达式多行:(请参阅?stringr::regex
)
td <- unlist(str_extract_all(txt, regex("\\bTD\\b[\\t\\s]*?.+?\\bCO\\b", dotall=TRUE)))
但是,我建议您只根据需要捕获输入格式的特征。例如,我不会通过正则表达式检查日期格式。只需搜索"^ PD.*"
并让R尝试解析结果。如果它不匹配,它会抱怨。
要过滤以多个空格开头的文本块,例如在TD标记之后,您可以使用multiline=
选项使用^
来匹配每个(不仅是第一个)行开头。 E.g。
str_extract_all(txt, regex("^TD\\s+(^\\s{3}.*\\n)+", multiline = TRUE))
(请注意,正则表达式类\s
包含\n
,所以我不需要在匹配TD
行后明确指定
最后,如果输入中缺少某个TD或PD字段,您当前的方法可能会为文本分配错误的日期!与for
结合而不是正则表达式匹配的readLines
循环可能对此有所帮助: