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
我是 regex
和 stringr
的新手,我正在尝试提取换行符后的单词:
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 个水平空格。
我有一个看起来像这样的字符串:
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
我是 regex
和 stringr
的新手,我正在尝试提取换行符后的单词:
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 个水平空格。