1

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

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

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

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

这让我更接近了:

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

但我不知道如何捕获整个文本列,例如,获取完整的“类型:蓝领”,而不是“\ ntype”。

4

1 回答 1

2

您可以使用

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)- 多行(^匹配一行的开头和$匹配行的结尾)和单行/点全(.也匹配换行符)模式 -
  • ^- 一行的开始
  • -{3,}- 三个或更多连字符
  • \n- 换行符
  • (.*?)- 第 1 组:任何 0+ 个字符,但尽可能少
  • \n- 换行符
  • -{3,}- 三个或更多连字符
  • $- 行结束。

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

  • (?m)- 多行模式开启
  • ^- 一行的开始
  • \\S- 一个非空白字符
  • .*?- 除换行符以外的任何 0+ 字符,尽可能少
  • (?=\\h{2})- 在当前位置的右侧,必须有 2 个水平空格。
于 2019-08-22T09:44:27.380 回答