stringr 提取一列文本

stringr to extract a column of text

我有一个看起来像这样的字符串:

t2 <- "============================================
                       Model 1    Model 2   
--------------------------------------------
education               3.66 ***    2.80 ***
                       (0.65)      (0.59)   
income                  1.04 ***    0.85 ***
                       (0.26)      (0.23)   
type: blue collar      -5.91      -27.55 ***
                       (3.94)      (5.41)   
type: white collar     -8.82 **   -24.12 ***
                       (2.79)      (5.35)   
income x blue collar                3.01 ***
                                   (0.58)   
income x white collar               1.91 *  
                                   (0.81)   
prop. female            0.01        0.08 *  
                       (0.03)      (0.03)   
--------------------------------------------
R^2                     0.83        0.87    
Adj. R^2                0.83        0.86    
Num. obs.              98          98       
============================================
*** p < 0.001, ** p < 0.01, * p < 0.05"

我正在尝试提取左侧的列,以便获得如下所示的矢量:

education
income
type: blue collar
type: white collar
income x blue collar
income x white collar
prop. female

我是 regexstringr 的新手,我正在尝试提取换行符后的单词:

library(stringr)
covariates <- str_extract_all(t2, "\n\w+")
covariates

这让我更接近了:

[1] "\neducation" "\nincome"    "\ntype"      "\ntype"      "\nincome"    "\nincome"    "\nprop"      "\nR"        
 [9] "\nAdj"       "\nNum"

但我不知道如何捕获整列文本,例如,获取完整的 "type: blue collar",而不是“\ntype”。

您可以使用

covariates <- str_extract_all(
        str_match(t2, "(?ms)^-{3,}\n(.*?)\n-{3,}$")[,2], 
        "(?m)^\S.*?(?=\h{2})"
)

或者,要使其工作得更快,请使用这些 模式:

covariates <- str_extract_all(
        str_match(t2, "(?m)^-{3,}\n(.*(?:\n(?!-{3,}$).*)*)\n-{3,}$")[,2],
        "(?m)^\S\H*(?:\h(?!\h)\H*)*"
)

使用 str_match(t2, "(?ms)^-{3,}\n(.*?)\n-{3,}$")[,2],您可以提取两行之间由 3 个或更多连字符组成的所有文本。以下是该模式的详细信息:

  • (?ms) - 多行(使 ^ 匹配行首,$ 匹配行尾)和 singleline/dotall(使 . 匹配行也有休息)-
  • 模式
  • ^ - 行首
  • -{3,} - 三个或更多连字符
  • \n - 一个换行符
  • (.*?) - 第 1 组:任何 0+ 个字符,但尽可能少
  • \n - 一个换行符
  • -{3,} - 三个或更多连字符
  • $ - 行尾。

稍后在字符串的那部分使用 (?m)^\S.*?(?=\h{2}) 并匹配

  • (?m) - 开启多行模式
  • ^ - 行首
  • \S - 非空白字符
  • .*? - 除换行字符外的任何 0+ 个字符,尽可能少
  • (?=\h{2}) - 在当前位置的右侧,必须有 2 个水平空格。