Select 由两个空格括起来的子字符串

Select substring bracketed by two whitespaces

我在 R 中使用正则表达式。

我的问题有点类似于this one,但我需要一个更具体的解决方案。我有一个字符向量。每个字符串的格式如下:

"text    text1     text2  text3"

文本块之间有很多白色space。我想从每个字符串中提取 text1。 Text1 的两边总是至少有两个白色space,但其他所有文本块也是如此。 Text1 的名称类似于 "Monty Python":可能包含一个 space,但绝不会包含两个 space。

我正在使用 stringrstr_extract 函数仅提取模式的第一次出现。但我不确定如何指定我的模式。我试了str_extract(z, "\s{2,}[a-z]*\s{2,}"),表示我想要白色space之间至少有一个字母。这导致了 NA。有没有办法隔离 text1?

您需要确认字母大小写,因为您的子字符串可能有 lower/upper 个大小写字母,并包含一个可选的组构造以匹配子字符串的第二个单词实例。

字符向量(基于您对输入的描述):

x <- c('foo    Monty Python      baz        quz',
       'foo    Monty        baz         quz')

使用 stringr 包:

str_trim(str_extract(x, "\s{2,}[a-zA-Z]+( [a-zA-Z]+)?\s{2,}"))
# [1] "Monty Python" "Monty"

使用 base R 中的正则表达式:

trimws(regmatches(x, gregexpr('\s{2,}[a-zA-Z]+( [a-zA-Z]+)?\s{2,}', x)))
# [1] "Monty Python" "Monty"

虽然,我只是简单地在这里使用 strsplit

sapply(strsplit(x, '\s{2,}'), '[', 2)
# [1] "Monty Python" "Monty"