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

时间:2017-12-04 23:13:40

标签: regex gsub

我正在尝试使用

在第一个空格后提取单词
  

物种< -gsub(“。*([A-Za-z] +)”,“\ 1”,x =属)

这适用于有两个单词的其他行,但是行[9]“Eulamprus tympanum marnieae”有3个单词而我的代码只返回字符串“marnieae”中的最后一个单词。如何在第一个空格后提取单词,这样我就可以检索“鼓膜”而不是“marnieae”,但将答案存储在一个名为> species的变量中。

  

[9]“Eulamprus tympanum marnieae”

1 个答案:

答案 0 :(得分:0)

您的原始模式无法正常工作,因为子模式[A-Za-z]+与空格不匹配,因此只匹配一个单词。

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

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

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

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

更可靠的方法如下:

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

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

此模式将捕获一个单词(在第一个单词之后),后跟任意数量的加法单词(包括0),用空格分隔。

然而,从我记得的生物学课程来看,物种只有一两个名字,而且从不资本化。以下模式将反映此格式:

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

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