使用Gsub在R中获取匹配的字符串——正则表达式

Using Gsub to get matched strings in R - regular expression

我正在尝试使用

在第一个 space 之后提取单词

species<-gsub(".* ([A-Za-z]+)", "", x=genus)

这适用于其他有两个词的行,但是第 [9] "Eulamprus tympanum marnieae" 行有 3 个词,我的代码只返回字符串 "marnieae" 中的最后一个词。我怎样才能提取第一个 space 之后的单词,这样我就可以检索 "tympanum marnieae" 而不是 "marnieae" 但答案存储在一个名为 >species.

的变量中

genus

[9] "Eulamprus tympanum marnieae"

您的原始模式无效,因为子模式 [A-Za-z]+ 不匹配空格,因此只会匹配一个单词。

您可以使用以下模式匹配双引号内第一个单词之后的任意数量的单词(0 除外):

"[A-Za-z]+ ([A-Za-z ]+)" https://regex101.com/r/p6ET3I/1

https://regex101.com/r/p6ET3I/2

这是一个相对简单但不完善的解决方案。它还将匹配尾随空格,或者仅匹配第一个单词后的一个或多个空格,即使第二个单词不存在也是如此。例如 "Eulamprus " 将成功匹配模式,而 return 5 个空格。如果您相信您的数据格式正确,您应该只使用此模式。

更可靠的方法如下:

"[A-Za-z]+ ([A-Za-z]+(?: [A-Za-z]+)*)"

https://regex101.com/r/p6ET3I/3

此模式将捕获一个词(第一个词之后),然后是任意数量的附加词(包括 0 个),以空格分隔。

然而,根据我对生物学的记忆 class,物种仅由一两个名称组成,而且从未大写。以下模式将反映此格式:

"[A-Za-z]+ ([a-z]+(?: [a-z]+)?)"

https://regex101.com/r/p6ET3I/4