R tidyr regex:从字符列中提取有序数字

Eul*_*ter 2 regex r regex-lookarounds tidyr

假设我有一个这样的数据框

df <- data.frame(x=c("This script outputs 10 visualizations.", 
                     "This script outputs 1 visualization.", 
                     "This script outputs 5 data files.", 
                     "This script outputs 1 data file.", 
                     "This script doesn't output any visualizations or data files", 
                     "This script outputs 9 visualizations and 28 data files.", 
                     "This script outputs 1 visualization and 1 data file."))
Run Code Online (Sandbox Code Playgroud)

看起来像这样

                                                            x
1                      This script outputs 10 visualizations.
2                        This script outputs 1 visualization.
3                           This script outputs 5 data files.
4                            This script outputs 1 data file.
5 This script doesn't output any visualizations or data files
6     This script outputs 9 visualizations and 28 data files.
7        This script outputs 1 visualization and 1 data file.
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法,可能使用Tidyverse来提取每行的可视化数量和文件数量?当没有可视化(或没有数据文件,或两者兼有)时,我想提取0. 基本上我希望最终的结果是这样的

    viz   files
1    10       0
2     1       0
3     0       5
4     0       1
5     0       0
6     9      28
7     1       1
Run Code Online (Sandbox Code Playgroud)

我尝试使用类似的东西

str_extract(df$x, "(?<=This script outputs )(.*)(?= visualizatio(n\\.$|ns\\.$))")
Run Code Online (Sandbox Code Playgroud)

但我迷路了。

akr*_*run 5

我们可以使用正则表达式查找str_extract将一个或多个数字 ( \\d+) 后跟一个空格和 'vis' 或 'data files' 提取到两列中

library(dplyr)
library(stringr)
df %>% 
  transmute(viz = as.numeric(str_extract(x, "\\d+(?= vis)")),
            files = as.numeric(str_extract(x, "\\d+(?= data files?)"))) %>%
  mutate_all(replace_na, 0)
#  viz files
#1  10     0
#2   1     0
#3   0     5
#4   0     0
#5   0     0
#6   9    28
#7   1     0
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,该模式匹配一​​个或多个数字 ( \\d+) 后跟正则表达式环视 ( (?=),其中有一个空格后跟 'vis' 单词,在第二列中,它提取后跟空格和单词 ' 的数字文件”或“文件”