选择由两个空格括起来的子串

时间:2016-07-20 00:55:55

标签: regex r string whitespace

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

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

stringr

文本块之间有很多空格。我想从每个字符串中提取text1。 Text1在任何一侧始终至少有两个空格,但每个其他文本块也是如此。 Text1将是一个名为“Monty Python”的名称:可能包含空格,但绝不包含两个空格。

我正在使用str_extractstr_extract(z, "\\s{2,}[a-z]*\\s{2,}")函数仅提取模式的第一次出现。但我不知道如何指定我的模式。我试过modal-body,表示我希望空格之间至少有一个字母。这导致了NA。有没有办法隔离text1?

1 个答案:

答案 0 :(得分:1)

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

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

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"

使用基础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"