问题描述
我的数据集中有以下文本:
[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,# 6225 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 1-bovespa c 1-bovespa 40,14 725,60 d resumo dos negócios"
我想提取两个标准之间的各种文本,特别是“1-bovespa”和“d”之间包含的文本。目前,我使用 str_extract readtext 包,但它只对找到的第一个模式这样做。但是,我希望该命令滚动浏览所有文本,并在再次找到该模式时构建一个数据框。
我正在尝试这样的事情:
str_extract_all(out,"\\(1-bovespa).+?\\d")
解决方法
您模式中有括号 - 逃出所以他们从字面上理解。您的文本没有括号。此外,\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 d"
# [2] "1-bovespa c fracionario magaz luiza on eb nm # 9 25,84 d"
# [3] "1-bovespa c fracionario magaz luiza on eb nm 40 25,40 d"
# [4] "1-bovespa c fracionario mrv on ed"
,
这是一种使用重复模式作为分隔符的不同方法。这有点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,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 d
2 1-bovespa c fracionario magaz luiza on eb nm # 9 25,84 d
3 1-bovespa c fracionario magaz luiza on eb nm 40 25,40 d
4 1-bovespa c fracionario mrv on ed nm 40 18,60 d