【问题标题】:Is there an R function to capture a lot of patterns in a text?是否有一个 R 函数可以捕获文本中的大量模式?
【发布时间】:2021-07-01 09:44:09
【问题描述】:

我的数据集中有以下文本:

[1] "q negociação c/v tipo mercado prazo especificação do título obs (*) quantidade preço / ajuste valor operação / ajuste d/c 1-bovespa c fracionario magaz luiza on eb nm # 1 25,76 25, 76 d 1-bovespa c fracionario magaz luiza on eb nm #9 25,76 231,84 d 1-bovespa c fracionario magaz luiza on eb nm 40 25,76 1030,40 d 1-bovespa c fracionario mrv on ed nm 40 18 ,14 725,60 d resumo dos negócios"

我想提取两个标准之间的各种文本,特别是“1-bovespa”和“d”之间包含的文本。目前,我使用 str_extract readtext 包,但它仅用于找到的第一个模式。但是,我希望命令滚动浏览所有文本,并在再次找到模式时构建一个数据框。

我正在尝试这样的事情:

str_extract_all(out, "\\(1-bovespa).+?\\d")

【问题讨论】:

  • 请显示所描述尝试的代码。
  • 是的,str_extract 是找到的第一个模式。切换到str_extract_all 以获取所有匹配项。他们共享一个帮助页面,有关详细信息,请参阅?str_extract。它将返回一个list,您可以根据需要将其转换为矢量/数据框。
  • 我看到您已将代码编辑为使用 str_extract_all。有了这个改变,你还有问题吗?如果有,是什么?
  • 如果您注意到,我在同一模式中包含四个信息,例如:“1-bovespa c fractional magaz luiza no eb nm #1 25.76 25.76 d”。所以我想用这些信息得到 4 个向量。但是,该命令提供了几个与此模式无关的其他向量。

标签: r string dataframe text read-text


【解决方案1】:

这是一种使用重复模式作为分隔符的不同方法。这有点hacky,但似乎有效:

library(tidyverse)
text <- "q negociação c/v tipo mercado prazo especificação do título obs (*) quantidade preço / ajuste valor operação / ajuste d/c 1-bovespa c fracionario magaz luiza on eb nm # 1 25,76 25,76 d 1-bovespa c fracionario magaz luiza on eb nm # 9 25,76 231,84 d 1-bovespa c fracionario magaz luiza on eb nm 40 25,76 1030,40 d 1-bovespa c fracionario mrv on ed nm 40 18,14 725,60 d resumo dos negócios"


delim1 <- "1-bovespa "
delim2 <- " d"

result <- strsplit(text, delim1) %>% 
  unlist() %>%
  paste0(delim1, .) %>% 
  strsplit(., " d") %>% 
  unlist() %>% 
  enframe(value = "text", name = NULL) %>% 
  slice(2:nrow(.)) %>%
  mutate(text = paste0(text, delim2)) %>% 
  filter(grepl(delim1, text))

结果:

result
# A tibble: 4 x 1
  text                                                           
  <chr>                                                          
1 1-bovespa c fracionario magaz luiza on eb nm # 1 25,76 25,76 d 
2 1-bovespa c fracionario magaz luiza on eb nm # 9 25,76 231,84 d
3 1-bovespa c fracionario magaz luiza on eb nm 40 25,76 1030,40 d
4 1-bovespa c fracionario mrv on ed nm 40 18,14 725,60 d  

【讨论】:

  • 您好,此代码返回错误:“strsplit(text, delim) 中的错误:找不到对象'delim'”
  • 在上面更新 - 应该是 paste0(delim1, .) 而不是 paste0(delim, .)。将另一个 delim 引用更改为 delim1
【解决方案2】:

您的模式中有括号 - 已转义,因此按字面意思理解。您的文本没有括号。此外,\d 是一个特殊的正则表达式来匹配数字,你需要一个文字 d。我删除了括号和\\,它似乎工作:

out = "q negociação c/v tipo mercado prazo especificação do título obs (*) quantidade preço / ajuste valor operação / ajuste d/c 1-bovespa c fracionario magaz luiza on eb nm # 1 25,76 25,76 d 1-bovespa c fracionario magaz luiza on eb nm # 9 25,76 231,84 d 1-bovespa c fracionario magaz luiza on eb nm 40 25,76 1030,40 d 1-bovespa c fracionario mrv on ed nm 40 18,14 725,60 d resumo dos negócios"
str_extract_all(out, "1-bovespa.+?d")
# [[1]]
# [1] "1-bovespa c fracionario magaz luiza on eb nm # 1 25,76 25,76 d" 
# [2] "1-bovespa c fracionario magaz luiza on eb nm # 9 25,76 231,84 d"
# [3] "1-bovespa c fracionario magaz luiza on eb nm 40 25,76 1030,40 d"
# [4] "1-bovespa c fracionario mrv on ed" 

【讨论】:

  • 感谢 Gregor,这项工作非常好。我一直在寻找类似的东西,但我不知道“d”是捕获文本的特殊功能。
  • 好吧,d 只是一个 d,但在正则表达式中的 \d(或在 R 正则表达式中的 \\d)是一个特殊字符。 \c, \s, \d, \w, \x, \b, ...都是特殊含义。
猜你喜欢
  • 1970-01-01
  • 2021-03-12
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多