[英]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
。 我一直在尝试使用模式匹配,但我不断得到
例如,我为一个简单的测试创建了这个对象:
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"
您可以找到objectID
和objectType
的位置,然后选择与这些位置相关的数据。
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.