0

我正在尝试在 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

任何帮助,将不胜感激。谢谢

4

1 回答 1

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=选项^。例如

str_extract_all(txt, regex("^TD\\s+(^\\s{3}.*\\n)+", multiline = TRUE))

(请注意,正则表达式类\s包含\n所以我不需要在匹配TD行后明确指定)

如果缺少字段,请小心

最后,如果输入中缺少 TD 或 PD 字段之一,您当前的方法可能会为文本分配错误的日期!for与而不是正则表达式匹配相结合的循环readLines可能对此有所帮助:

于 2018-04-04T12:37:26.630 回答