繁体   English   中英

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

[英]Pattern Matching using Grep and/or RegEx to Extract ID from metadata field in R

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

{\"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. 意想不到的结果

例如,我为一个简单的测试创建了这个对象:

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\\\\<则它返回整个元数据字符串。

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

需要明确的是,您得到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)返回一个包含所选元素的字符向量。

如果你想获取子字符串值,base R 可以很好地处理这个问题。

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

或者您可以简单地使用stringr库来执行此操作。

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

您可以找到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"

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM