R - 在第二个空格后删除文本

时间:2016-12-21 13:29:39

标签: r regex string

我有一个像这样的矩阵(每一行都是一个字符串):

m <- matrix(c("Agarista revoluta (Spreng.) Hook. f. ex Nied.", 
              "Amaioua intermedia Mart.", 
              "Baccharis reticularia DC."),, 1)

我想在第二个空格后删除文本并返回:

Agarista revoluta
Amaioua intermedia
Baccharis reticularia

我尝试了gsub的一些组合,但我没有成功。

任何人都可以帮我吗?

4 个答案:

答案 0 :(得分:6)

您可以使用

x <- c("Agarista revoluta (Spreng.) Hook. f. ex Nied.", "Amaioua intermedia Mart.", "Baccharis reticularia DC.")
sub("^(\\S*\\s+\\S+).*", "\\1", x)
## => [1] "Agarista revoluta"     "Amaioua intermedia"    "Baccharis reticularia"

请参阅regex demoonline R demo

模式详情

  • ^ - 字符串开头
  • (\\S*\\s+\\S+) - 第1组捕获0 +非空白字符,然后是1 +空格,然后是1 +非空格
  • .* - 任意0个字符,尽可能多(直到字符串结尾)。

请注意,如果您的字符串可能有前导空格,并且您不想计算该空格,则应使用

sub("^\\s*(\\S+\\s+\\S+).*", "\\1", x)

请参阅another R demo

答案 1 :(得分:3)

另一种可能的正则表达式可能是,

sub('^(\\w+\\s+\\w+).*', '\\1', x)
#[1] "Agarista revoluta"     "Amaioua intermedia"    "Baccharis reticularia"

或者,stringr包对这些类型的操作有一些很好的功能。例如,

library(stringr)
word(x, 1, 2)
#[1] "Agarista revoluta"     "Amaioua intermedia"    "Baccharis reticularia"

答案 2 :(得分:2)

这不使用正则表达式或包:

with(read.table(text = m, fill = TRUE), trimws(paste(V1, V2)))

,并提供:

[1] "Agarista revoluta"     "Amaioua intermedia"    "Baccharis reticularia"

如果每个输入至少有两个单词,那么您可以省略trimws

答案 3 :(得分:1)

将字符串拆分为“”然后将前两个文本分开并将它们粘贴在一起

x <- c("Agarista revoluta (Spreng.) Hook. f. ex Nied.", "Amaioua intermedia Mart.", 
       "Baccharis reticularia DC.")
sapply(x, function(y) paste(unlist(strsplit(y, " "))[1:2], collapse = " "))
相关问题