模式匹配使用Grep和/或RegEx从R中的元数据字段中提取ID

时间:2014-08-06 21:15:06

标签: regex r grep

我的元数据字符串如下所示:

{\"vote\":\"com.jivesoftware.community.acclaim.impl.VoteImpl@8b6b31f7\",\"referringSource\":null,\"referringUser\":null,\"acclaim\":\"AcclaimImpl{acclaimID=3146, object=EntityDescriptor{objectID=1900, objectType=102}, acclaimType='like', visibility=true, creationDate=Mon Jul 13 11:52:18 PDT 2014, modificationDate=Mon Jul 13 11:52:18 PDT 2014, properties={}}\",\"create\":true} 

我需要提取objectID。我一直在尝试使用模式匹配,但我一直在使用

  1. 没有匹配
  2. 整个元数据都返回给我,或
  3. 意外结果
  4. 例如,我为一个简单的测试创建了这个对象:

    testme <- "{\"vote\":\"com.jivesoftware.community.acclaim.impl.VoteImpl@8b6b31f7\",\"referringSource\":null,\"referringUser\":null,\"acclaim\":\"AcclaimImpl{acclaimID=3246, object=EntityDescriptor{objectID=1400, objectType=102}, acclaimType='like', visibility=true, creationDate=Mon Jul 14 11:52:18 PDT 2014, modificationDate=Mon Jul 14 11:52:18 PDT 2014, properties={}}\",\"create\":true}"
    

    我尝试以下操作,当我在一个名为RegEx Magic的程序中创建并测试它时,它似乎工作正常,我在该程序中指定了我的R版本:

    grep("\\AobjectID=[0-9]+[[:>:]]\\z", testme, perl=TRUE, value=TRUE);
    

    但我得到的结果是:

    character(0)
    

    我尝试了一些更简单的方法,例如:

    regexpr(pattern="\\<objectID=[0-9]{1,4}", testme, useBytes = FALSE, fixed = TRUE)
    

    regexpr(pattern="\\bobjectID=[0-9]", testme, useBytes = FALSE)
    

    那些导致了意想不到的结果(即我不确定它给了我什么,但它不是我想要的):

    [1] -1
    attr(,"match.length")
    [1] -1
    attr(,"useBytes")
    [1] TRUE
    

    [1] 176
    attr(,"match.length")
    [1] 10
    attr(,"useBytes")
    [1] TRUE
    
    分别是

    。如果我删除\\b\\<,则会返回整个元数据字符串。

    有人可以帮我解决这个问题吗?提前谢谢。

3 个答案:

答案 0 :(得分:2)

要清楚,您获得character(0)结果的原因是因为您的正则表达式不正确。 \A锚点匹配字符串开头的位置,\z锚点匹配字符串最末端的位置。

您要搜索的子字符串位于字符串中的两个位置,实际上它位于中间位置。所以你需要删除锚点,你也可以删除与字符类相关的边界和perl=T

> grep("objectID=[0-9]+", x, value=TRUE)
# [1] "{\"vote\":\"com.jivesoftware.community.acclaim.impl.VoteImpl@8b6b31f7\",\"referringSource\":null,\"referringUser\":null,\"acclaim\":\"AcclaimImpl{acclaimID=3246, object=EntityDescriptor{objectID=1900, objectType=102}, acclaimType='like', visibility=true, creationDate=Mon Jul 14 11:52:18 PDT 2014, modificationDate=Mon Jul 14 11:52:18 PDT 2014, properties={}}\",\"create\":true}"

注意: grep(value = TRUE)会返回包含所选元素的字符向量。

如果你想获取子字符串值,基数R处理这个就好了。

> regmatches(x, gregexpr('(?<=\\bobjectID=)\\d+', x, perl=T))[[1]]
# [1] "1900"

或者您只需使用stringr库即可。

> library(stringr)
> str_extract(x, perl('(?<=\\bobjectID=)\\d+'))
# [1] "1900"

答案 1 :(得分:1)

您可以找到objectIDobjectType的位置,然后选择相对于这些位置的数据。

require(stringr)
objectID_loc <- str_locate(x, "objectID")
objectType_loc <- str_locate(x, "objectType")
objectID <- substr(x, objectID_loc[, "end"] + 2, objectType_loc[, "start"] - 3)

这会给你:

> objectID
[1] "1900"

答案 2 :(得分:1)

使用您的第一个示例字符串尝试此操作。它匹配正则表达式并返回括号内的部分:

> library(gsubfn)
> strapplyc(s, "objectID=(\\d+)")[[1]]
[1] "1900"