如何在R中正确格式化此正则表达式搜索?它在在线测试仪中工作正常

时间:2014-08-15 18:00:36

标签: regex r parsing

在R中,我在数据框中有一列数据,每个元素看起来像这样:

Bacteria;Bacteroidetes;Bacteroidia;Bacteroidales;Marinilabiaceae

我想要的是最后一个分号之后的部分,我一直在尝试使用'sub'并复制现有列并创建一个只保留结尾的新列。从本质上讲,我想要这个(属):

Marinilabiaceae

代码片段如下所示:

mydata$new_column<- sub("([\\s\\S]*;)", "", mydata$old_column)

在这种情况下,由于R的转义序列,我使用的是\\而不是\sub替换了我不想要的部分,并将其更新为新列。我已经在这样的地方多次测试了Regex:http://regex101.com/r/kS7fD8/1

然而,我仍在苦苦挣扎,因为结果非常奇怪。现在我的新专栏中填充了有机体的域而不是属Bacteria

我该如何解决这个问题?是否有任何易于理解的资源可以更多地了解R的Regex格式?

3 个答案:

答案 0 :(得分:1)

让它贪婪并从所需的索引中获取匹配的组。

       (.*);(.*)
             ^^^------- Marinilabiaceae

这是regex101 demo

要获得第一个单词,请使用 Non-Greedy 方式

             (.*?);(.*)
Bacteria -----^^^

这是demo

答案 1 :(得分:1)

从简单的字符串开始,

string <- "Bacteria;Bacteroidetes;Bacteroidia;Bacteroidales;Marinilabiaceae"

您可以在"^(.*);"

的通话中使用sub删除最后一个分号的所有内容
> sub("^(.*);", "", string)
# [1] "Marinilabiaceae"

您还可以将strsplittail

一起使用
> tail(strsplit(string, ";")[[1]], 1)
# [1] "Marinilabiaceae"

您的正则表达式([\\s\\S]*;)主要不会起作用,因为\\s匹配任何空格字符,并且您的字符串不包含任何空格。我认为它在regex101网站上有效,因为该正则表达式测试器默认为pcre (php)(参见&#34; Flavor&#34;在左上角),R regex语法略有不同。在许多情况下,R需要额外的反斜杠转义字符。作为参考,this R text processing wiki以前曾多次派上用场。

答案 2 :(得分:1)

在最后一次之后提取所有内容;到你可以使用的行的末尾:

[^;]*?$