使用R中的正则表达式捕获特定的JSON-LD属性

时间:2018-08-17 08:54:34

标签: r regex

使用R,我想从@type标记内的JSON-LD有效载荷中捕获特定属性(在这种情况下为<script>)。这是一个示例片段:

<script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "WebSite",
        ...

这是R中用于执行属性提取的示例代码:

x <- "<script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"url\":\"https://www.foo.com/\""
regmatches(x, regexpr("<script [^>]*type *= *['\"] *application/ld.json *['\"][^>]*>[^}]+ ['\"] *@type *['\"] *: *['\"]([^'\"]+)['\"]", x, ignore.case = TRUE))

此代码的输出如下:

[1] "<script type=\"application/ld+json\">{    \"@context\": \"https://schema.org\"    \"@type\":\"WebSite\""

我期望的输出是这个:

[1] "WebSite"

我对R并没有扎实的经验,对正则表达式也没有扎实的经验,但是令我感到困扰的是,我已经在regex101 website中尝试过此正则表达式(可以检查测试{{ 3}})。

您能提示我如何返回正确的属性而不是完整的测试字符串吗?

1 个答案:

答案 0 :(得分:1)

您可以使用基于\K的PCRE模式在特定模式之后提取'"之外的任意1个以上的字符:

x <- "<script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"url\":\"https://www.foo.com/\""
p <- "<script\\s[^>]*type *= *['\"] *application/ld.json *['\"][^>]*>[^}]+['\"] *@type *['\"] *: *['\"]\\K[^'\"]+"
regmatches(x, regexpr(p, x, ignore.case = TRUE, perl=TRUE))
## => "WebSite"

请参见R demo online

它看起来像<SOME_LEFTHAND_CONTEXT_PATTERN>\K<WHAT_YOU_NEED>\K运算符将忽略到目前为止匹配的所有文本,并且您只会在结果中得到<WHAT_YOU_NEED>。参见this pattern demo。不要忘记perl=TRUE参数将在此处启用PCRE regex引擎。